返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++11 关键字 const 使用小结
  • 574
分享到

C++11 关键字 const 使用小结

2024-04-02 19:04:59 574人浏览 安东尼
摘要

Const 的作用及历史 const (computer programming) - Wikipedia 一、历史 按理来说,要想了解一件事物提出的原因,最好的办法就是去寻找当时的

Const 的作用及历史

const (computer programming) - Wikipedia

一、历史

按理来说,要想了解一件事物提出的原因,最好的办法就是去寻找当时的历史背景,以及围绕这件事所发生的故事。

可是非常抱歉,我并没没有找到C语言中const 提出的背景,但是一个可以参考的历史是,常量这种数据形式早在汇编语言中就有所体现,汇编语言中的constant 是一个确定的数值,在汇编阶段就可以确定直接编码在于指令代码中,不是保存在寄存器中的可以变化的量。

常量是需求,C 语言没理由不保留这个传统,自然而然的const 关键字出现了。

二、C和c++的异同点

顾名思义,const 最基础的作用就是保证数据不会被修改,仅仅可读而已。这就好比一份没有write 权限的文件一样,只能远观而已。

constC语言32个关键字(C++中有49个)中的一个,主要起类型修饰的作用,可以理解为变量的属性,比方说const int a = 10 从右往左看int a = 10 是定义并初始化了一个变量a 等于10,随后使用const 修饰这个变量,告诉编译器,这个变量是不可修改的。为了维护程序的安全性,由于const 一旦修饰就无法再更改了,那么const int a; 会生成一个值随机且永远无法修改的量,这样非常不安全,所以C 的编译器会要求你必须在定义的时候就立马初始化。从这里也可以看出const关键字的强硬之处。

到底const该放在哪?

在详细讨论const的用法之前,必须首先明白,const 是C语言中的一个类型限定符(type quailier),是类型的一个部分,且const 越靠近谁,就修饰谁是常量类型。

从C语言的基础数据类型来看,基本上可以抽象为一下几个类别

  • 基础数据类型(整型,浮点)

对于基础数据类型,使用const就单纯定义为一个不可修改的量,此时由于不涉及其他的类型限制符,所以const放在哪里都是有效的

const int i = 10 \(\Leftrightarrow\) int const i = 10 但是一般const在前。

  • 指针类型(指针)

相比于基础数据类型,指针类型存在很大的不同。

不使用const修饰的指针,此时表示该指针一定指向一个变量,当指向const修饰的变量是就会报错


const int a = 10;
int * ptr = a; // error

const 放在 int *前时,表示指针类型是 const int 类型,那么依据指针类型的定义,该指针必定指向一个const int 类型的量,即常量。


const int b = 100;
const int * a = &b;

const 放在 int * 后面时,int * const a ,显然根据常规的指针类型的定义,我们只能推测出这是一个指向int类型的指针,那么const起什么作用呢?(见如下代码)


int c = 10, b = 20;
const int b = 30;
int * const a = &c; // 此处没有报错,证明*号前面是指针类型,这条真理没错
//1.  可当我们尝试修改指向的时候
a = &b; 
// 此处会报错!这表明const靠近变量名的时候表示指针指向一个变量后就无法更改了

//2. 如果一开始就不初始化int * const a呢?
int * const a; // 此处会报错

//3. 如果尝试让他指向一个const量呢?
int * const a = &b; // 此处会报错

以此类推可以得到一个指向const变量的无法修改指向的指针


const int b = 10;
const int * const a = &b;

所以可以给出总结

  • const 靠近变量名的时候表示指针必须指向一个类型与指针类型相同的变量
  • 一旦指向就无法更改指向
  • 无法指向常量

复杂数据类型(枚举,结构,共用)

针对复杂类型,由于出现了简单类型的嵌套,自然会有const 的嵌套关系,下面以结构体来举例子

const嵌套在结构体内部时。


typedef struct a {
	const int b;
	int c;
}A;

int main() {
	A aa;
	aa.b = 10; // 此处会报错
}

在C语言中,在结构体内部使用const修饰不会报错的,但是此变量再也无法修改,意味着这是一个无效量,既无法初始化,也无法修改(但是得益于C++的面向对象机制,即使如此我们还是可以定义const并且给他赋值)。

当定义结构体的时候使用const


const A bb;

此时也会报错,而且相对来说比上面还严重,此时结构体内部的所有值都是乱的,且无法修改。

而C++中由于引入了几种新的编程模式,const 的作用范围又进一步被扩充。

类中属性与成员函数

结构体的遗留问题(即类的常量属性)

这里先来解决前面C语言中的结构体问题,需求是想在结构体内部定义const变量,知道结构体内部的变量是无法直接初始化的,而C++中结构体可以理解为类,只不过权限不同而已,同样可以拥有构造函数。

那么是不是可以在构造函数中初始化呢?(下面代码会报错)


struct a {
	a() {
		b = 100;
	}
	const int b;
};

不是我们想的那样,不过也非常接近,对于初始化类的变量还有一种方法,使用初始化列表(类的初始化列表的优先级是非常高的)


struct a {
	a() : b(100) {;}

  const int b;
};

或者还有


struct a {
    const int b = 100;
};

利用C++特性直接赋值,而此段代码在C语言中会报错,这也是C与C++不同的一个地方。

如此就完美解决了结构体const量 问题。

类的静态变量vs const 变量

static 也是一个修饰符,确定的是变量的生存期。const觉得变量的可读性,有这样一条语句在类中和main函数中存在不同的意义


static const int a; 
// 此语句在main中会报错,由于未初始化
// 在类中不会

这是由于static不会影响const的表达,在main函数中说明此变量就是const类型,确实需要立马赋值。而在类中可以不那么着急,可以把类中的static变量理解为一个申明,在类的外面或者里面直接定义都可以,不会报错。

函数const 以及类成员函数的const修饰

普通函数的const

函数const 首先想到的是const 变量返回值。但是这其实是没太大意义的

const修饰返回值其实完全没有发挥作用,属于无效修饰。同样的使用const修饰形式参数的时候也是如此,并不会限定你传入的是const还是普通变量,本质在于这一过程发生原因是由于值传递,不论是返回const 还是使用const 修饰形式参数,内部都发生了变量的创建与赋值

const修饰形参的例子,


int fun(const int a) {
	// a = 10 会报错
	return a
}

int main() {
	int c = 10;
	int d = fun(c);  // 不会报错
}

如上,c传入的时候是把c的值拿到,然后函数压栈,创建一个const int 变量a 且立马初始化为c的值,如此就在函数内部生成了一个const 变量。跟传入什么值完全没有关系。

成员函数的const尾修饰

这属于C++的特性,成员函数尾巴加上一个const 限制此函数对对象的修改,且提高了代码的可读性。


class A {
private:
	int a;

public:
	static int B;
	int getA() const {
		A::B = 100; // 此处不会报错
		a = 100; // 这里会报错
		return a;
	}
};

int A::B = 100;

使用const修饰成员函数会使该函数变成const member function 此类型无法修改对象的数据,但是可以修改可修改的静态变量。

  • 引用

引用相对来说没有指针那么多的变种,引用的const 修饰也仅仅局限于让引用变量无法修改指向这一点上。

  • 在补充一点

const修饰类静态整型变量的时候可以在类内部直接初始化(浮点数仍然是不行的)。

到此这篇关于C++11 关键字 const 使用小结的文章就介绍到这了,更多相关C++11 关键字 const内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C++11 关键字 const 使用小结

本文链接: https://lsjlt.com/news/159660.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C++11 关键字 const 使用小结
    Const 的作用及历史 const (computer programming) - Wikipedia 一、历史 按理来说,要想了解一件事物提出的原因,最好的办法就是去寻找当时的...
    99+
    2024-04-02
  • C++11关键字const怎么使用
    本篇内容主要讲解“C++11关键字const怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++11关键字const怎么使用”吧!一、历史按理来说,要想了解一件事物提出的原因,最好的办法...
    99+
    2023-06-25
  • c++关键字const的用法详解
    目录C语言const的用法1、指向常量的指针变量const int *p指针指向int a;2、常指针(常地址)int * const p指针指向int a;3、指向常量的常指针co...
    99+
    2024-04-02
  • C/C++中static,const,inline三种关键字详细总结
    一、关于staticstatic 是C++中很常用的修饰符,它被用来控制变量的存储方式和可见性,下面我将从 static 修饰符的产生原因、作用谈起,全面分析static 修饰符的实...
    99+
    2022-11-15
    static inline const
  • C++ const关键字分析详解
    目录C语言中修饰变量C语言中修饰指针变量C语言中修饰函数的参数C++中修饰变量C++中修饰函数的参数C++中修饰函数的返回值C++中修饰类的成员函数C++中修饰类的成员变量总结C语言...
    99+
    2024-04-02
  • C++中引用和const关键字介绍
    目录引用常引用const关键字用法1)定义常量2)定义常量指针3)定义常引用总结引用 下面的写法定义了一个引用,并将其初始化为引用某个变量。类型名 & 引用名 = 某变量名;...
    99+
    2024-04-02
  • c语言中const关键字的作用
    const关键字在c语言中用于修饰变量或函数,使其值或行为在程序执行期间保持不变。它可以修饰变量(使其成为常量),防止意外修改数据,提高程序安全性。此外,const还可以修饰函数,确保其...
    99+
    2024-05-10
    c语言 敏感数据 代码可读性
  • C++中引用和const关键字怎么用
    今天小编给大家分享一下C++中引用和const关键字怎么用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。引用下面的写法定义了...
    99+
    2023-06-29
  • c++11中的noexcept关键字
    目录c++11中noexcept关键字1. 概念2. 两种形式3. 异常处理4. 实现原理5. 使用场景c++11关键字noexcept替代throwc++11中noexcept关键...
    99+
    2024-04-02
  • C语言中的Const关键字怎么用
    这篇“C语言中的Const关键字怎么用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C语言中的Const关键字怎么用”文章吧...
    99+
    2023-06-29
  • C语言关键字const与volatile怎么用
    今天小编给大家分享一下C语言关键字const与volatile怎么用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、con...
    99+
    2023-06-30
  • C++ 右值引用与 const 关键字详解
    C++中的const关键字的用法非常灵活,而使用const将大大改善程序的健壮性,const关键字是一种修饰符。修饰符本身,并不产生任何实际代码。就 const 修饰符而言,它用来告...
    99+
    2024-04-02
  • 详解C++ 左值引用与 const 关键字
    左值引用是已定义的变量的别名,其主要用途是用作函数的形参,将 const 关键字用于左值引用时,其在初始化时可接受的赋值形式变得更加广泛了,这里来总结一下。 左值引用是已定义的变量的...
    99+
    2024-04-02
  • C#中的const和readonly关键字详解
    const和readonly经常被用来修饰类的字段,两者有何异同呢? const 1、声明const类型变量一定要赋初值吗? 一定要赋初值 public class Student ...
    99+
    2022-11-13
    C# const关键字 readonly关键字
  • 剖析C语言关键字之void,const,return
    目录returnvoid一.可做为函数的通用接口二.void不能修饰变量三.void修饰函数返回值const总结return 首先我们弄清楚c语言内存分配的方式 然后我们看一段代码...
    99+
    2024-04-02
  • C#中const,readonly和static关键字的用法介绍
    如果有一个值不太会变化,我们经常使用const和readonly,这2者有何不同呢?有时候,我们也会在readonly之前加上关键字static,这又意味着什么呢? const co...
    99+
    2024-04-02
  • JavaScript ES的let与const关键字怎么使用
    这篇文章主要讲解了“JavaScript ES的let与const关键字怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JavaScript ES的let与cons...
    99+
    2023-06-21
  • 深入聊聊C语言中的Const关键字
    目录前言01const简述02常量的应用常量作为函数的参数C++中应用加const03#define和const总结前言 const是一个C语言的关键字,它限定一个变量不允许被改变。...
    99+
    2024-04-02
  • 初识C++的const关键字,常量与常变量
    目录C语言的const1.const关键字2.const修饰的只读变量3.节省空间,避免不必要的内存分配,同时提高效率4.使用cosnt修饰4.1修饰一般变量4.2修饰数组4.3修饰...
    99+
    2024-04-02
  • ES6新增关键字let和const怎么用
    这篇文章主要介绍了ES6新增关键字let和const怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。ES6新增加了两个重要的JavaScript关键字:let和const...
    99+
    2023-06-29
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作