在C++中,要害字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 的议论还没有完毕,他是个才指针万用表的使用办法艺多面手,后续有时机再继续探索。