​在C++中,要害字const能够用来修饰任何效果域内的变量、函数参数、函数本体、函数返回值、成员函数、迭代器,也能够用来修饰指针自身和指针政策,可谓文武双全,咱们要具体了解其内部细节,以及逻辑微妙,让这把多功能瑞士军刀纵情发挥其效果,一同不要割伤自己安全手抄报哟!

文武双全的 const

1. 界说一个常全局变量:

const int global = 100;// 初始化之后不行再赋值

这样的global实际上是一个常量,这是安全生产法C++用来替代宏界说的其间一种办法,const常量有类型检测,前进编译器的功率。

2. 界说常指针,这有两个版别,分别是:

const int *p1 = &a; // p1不能修改它所指向的政策
int const *p1 = &a安全中心; // p1的另一种等价方式
int *const p2 = &a; // p2自身不行修改

上述安全代码中的p1经常被用作函数参数,用以绑缚指针的权限,在安全性方面功不行没。p2用的很少,咱们很少需求一个自身指向不行变的指针

3. 界说一个STL的常迭代器,这也有类似的两个版别:

vector::cons指针和引证的区别t_iteratorit1; // it1不能修改它所指代的政策政策

const vector::iterator it2;// it2自身不行修改

因为迭代器实际上便是广义指针,因而it1实际上相当于上述代码的p1,it2相当于上述代码的p2,同理it1用的较多,用来绑缚迭代器的权限。

4. 界说一个类的内部常成员,包括常成员安全数据和常成员办法:

clas指针万用表的使用办法s text

{

con指针数组st int aconst = 100;// 常成员数据,必须初始化

void func(void)const;// 常成员办法,只能由常政策调用

static int astatic;

};

类的常成员数据acon变量st,意味着类政策无法对其修改,这个很简单了解。至于类的常成员办法func就花费脑力了,语法上的了解是,func不能修改任何一个类政策的bit,这是清楚明了的,这也正是C++标准对const成员办法的界说。

来近安全教育渠道登录进口距离看看func办法的运用:

int text::astatic = 100; // 类外初始化静态数据

void text::func(void)const // 类外界说cons安全教育渠道登录进口t成员办法

{

astatic = 200; // 没缺点,astatic不是政策数据,此处能够被修改

aconst = 200; // 过失!变量泵const型函数不行修改类政策数据

}

界说如上的成员办法很重要,因为它明确地告知了类的运用者,哪些函数能够修改类政策信息,哪些不会修改类政策信息。

像 func() 这样的函数const成员办法,只能被常政策调用,以确保不违反权限紧缩原则,比方:

text t1; // 一般政策t1

const text t2; // const型政策t2

t1.fun安全教育渠道登录c();// 过失!一般政策不行调用常成员办法

t2.func();// 没缺点

留意,函数本体的const特点是能够被视为重载的根据的,换句话说假定以上类text供给了non-const版别的func函数,那么t1将会指针舆情帮手自动调用non-const那个版别。

以上陈述好像平平庸俗,但考虑C++语法规定的这种bit-w变量是什么意思ise特性的常成员在处理类成员指针,而且指针指向类外部内存时,情况或许会变得幽默。

5. bit-安全中心wise和logical-wise常特性

所谓bit-wise constness指的是类政策的内部内存意义上只读绑缚,而loigcal-wise指的是逻辑意义上的只读绑缚。编译器没有智能,它只变量提升能完结bit-wise意义上的绑缚,下面的比方议论const成员 operator[ ] 的体现能够帮忙了解:

class text
{
... ...
char &operator[ ]指针c语言(int pos) const;
private:
char *p;
};
// const要害字确保了该成员办法只能指针数组被 const 政策调用
char &text::opera安全期计算器tor[ ](int pos) const
{
return p[pos];
}

上述代码中,类指针万用表的使用办法text存储真实字符串的地方是指针 p 指向的内安全教育渠道存区域,假定此时界说一个 const 型的常政策,那么它只能确保类内部信息(也便是p自身)不被修改指针万用表的使用办法,却无法确保其所指向的变量英文内存区域的安全性。来看下面的代码:

const text ct(“abcd”);

ct[0] = ‘A’; // 一个被编译器容许却跟逻辑相悖的语句

此处ct是一个const型政策,从字面安全手抄报了解启航,咱们应该以指针数学为ct政策是一个常量,咱们应该无法通过任何办法修改其内部信息,但怅惘,ct里面的字符串信息实际上并不存在在类内存区域中,于是就呈现了能够变量名对一个const型政策进行赋值的幽默现象。

处理以上问题也不难,能够改写 operator[ ] 成员办法的返回值类型:

constchar &ope安全手抄报rator[ ](int pos)const;

此时就再也不能对 ct[0] 赋值了,但这只是个安全教育渠道登录进口个例,要害我变量泵们要掌握的内容是:假定咱们的类政策具有成员指变量提升针,那么变量名一般意义上的const成员办法只能确保bits-wise的常量性(即确保类政策内部的内存信息不被修改),但无法确保所谓的 logical-wis指针万用表的使用办法视频教程e的常量性(即确保逻辑上哪些信息安全不被修改)。

安全期是哪几天变量 const 的议论还没有完毕,他是个才指针万用表的使用办法艺多面手,后续有时机再继续探索。