const 是constant的简写,原意是维持不变的,难于发生改变的原意。const 在C++中是用以润色内建类别表达式,自表述第一类,核心成员表达式,codice,表达式参数。具体文本用语如下表所示:
1.一般表达式
1.1 情形一
const int a = 7;
int b = a; // 恰当
a = 8; // 严重错误,无法发生改变
a被表述为两个自变量,因此能将a表达式给b,但无法给a再度表达式。对两个常量表达式是违规的事,即使a被C++指出是两个自变量,其值不容许修正。
1.2 情形二
#include<iostream>
using namespace std;
int main(void)
{
const int a = 7;
int *p = (int*)&a;
*p = 8; //透过操作方式符来修正 与否可取????
cout<<a;
system(“pause”);
return 0;
}
对const表达式a,他们取表达式的门牌号并切换表达式给 对准int的操作方式符,接着借助*p = 8;再次对表达式a门牌号内的值表达式,接着输入查阅a的值。
从下面的增容询问处看见a的值被发生改变为8,但输入的结论依然是7。
从结论中他们能看见,C++接着指出a的值为一已经开始表述的7,因此对const a的操作方式就会造成下面的情形。因此一千万千万别轻而易举对const表达式想尽办法表达式,这会造成意料之外的犯罪行为。
2.操作方式符表达式
const 润色操作方式符表达式有下列四种情形。
2.1 情形一: const 润色操作方式符对准的文本,文本为不可表达式
const int *p = 8;
则操作方式符对准的文本 8 不可发生改变。简称左定值,即使 const 位于 * 号的左边。
2.2 情形二: const 润色操作方式符,操作方式符为不可表达式
int a = 8;
int* const p = &a;
*p = 9; // 恰当
int b = 7;
p = &b; // 严重错误
对 const 操作方式符 p 其对准的内存门牌号无法够被发生改变,但其文本能发生改变。简称,右定向。即使 const 位于 * 号的右边。
2.3 情形三:const 润色操作方式符和操作方式符对准的文本,指针和操作方式符对准的文本都为不可表达式
int a = 8;
const int * const p = &a;
这时,const p 的对准的文本和对准的内存门牌号都已固定,不可发生改变。
对以上四种情形,根据 const 位于 * 号的位置不同,我总结三句话便于记忆的话:”左定值,右定向,const润色不表达式”。
3.表达式参数
3.1 情形一 :值传递的 const 润色传递
#include<iostream>
using namespace std;
void Cpf(const int a)
{
cout<<a;
// ++a; 是严重错误的,a 无法被发生改变
}
int main(void)
{
Cpf(8);
system(“pause”);
return 0;
}
3.2情形二:const 参数为操作方式符,能防止操作方式符被意外篡改
#include<iostream>
using namespace std;
void Cpf(int *const a)
{
cout<<*a<<” “;
*a = 9;
}
int main(void)
{
int a = 8;
Cpf(&a);
cout<<a; // a 为 9
system(“pause”);
return 0;
}
3.3情形三:自表述类别的参数传递,需要临时第一类复制参数,对临时第一类的构造,需要调用构造表达式,比较浪费时间,因此他们采取 const 外加引用传递的方法
#include<iostream>
using namespace std;
class Test
{
public:
Test(){}
Test(int _m):_cm(_m){}
int get_cm()const
{
return _cm;
}
private:
int _cm;
};
void Cmf(const Test& _tt) //const 外加引用传递的方法
{
cout<<_tt.get_cm();
}
int main(void)
{
Test t(8);
Cmf(t);
system(“pause”);
return 0;
}
首先:引用传递就很凸显出它的优势,引用传递传递的是实参的门牌号,而值传递则是实参的拷贝,相当于把实参复制了一份;对STL容器、类或者结构体等的参数传递而言,使用引用传递能避免调用拷贝构造表达式,能够节省表达式调用时的内存分配,减少表达式调用过程中的时间消耗,从而提高系统效率。
其次:在参数传递的过程中,如果不希望在使用的过程中发生改变实参的值,那么能在前面加上“const”关键字,保持良好的代码风格。
4.表达式codice
当 的时候润色的是表达式codice:
4.1 情形一:const 润色表达式codice(返回操作方式符)
如果给以“操作方式符传递”方式的表达式codice加 const 润色,那么表达式codice(即操作方式符)的文本无法被修正,该codice只能被赋给加const 润色的同类别操作方式符。
4.2情形二:const 用于润色“返回引用”表达式的codice
如果表达式codice采用“值传递方式”,由于表达式会把codice复制到外部临时的存储单元中,加const 润色没有任何价值。例如把
表达式
写成
是没有意义的.
4.3情形三:在表达式名后面表示是 C++ 常核心成员表达式,该表达式无法修正第一类内的任何核心成员,只能发生读操作方式,无法发生写操作方式。
class People
{
public:
int talk(void);
int eat(void) const; // const 核心成员表达式
private:
int m_age;
};
int People::eat(void) const
{
++m_age; // 编译严重错误,企图修正数据核心成员m_num
talk(); // 编译严重错误,企图调用非const表达式
return m_age;
}
const 第一类只能访问 const 核心成员表达式,而非 const 第一类能访问任意的核心成员表达式,包括 const 核心成员表达式.const 第一类的核心成员是不可修正的,然而 const 第一类透过操作方式符维护的第一类却是能修正的.const 核心成员表达式不能修正第一类的数据,不管第一类与否具有 const 性质.它在编译时,以与否修正核心成员数据为依据,进行检查.然而加上 mutable 润色符的数据核心成员,对任何情形下透过任何手段都可修正,自然此时的 const 核心成员表达式是能修正它的参考:
C++ const用语小结 (欢迎大家拍砖)
C语言 const 润色表达式codice