const用以润色内建类别表达式,自订第一类,核心成员表达式,codice,auth。
用以选定两个语法束缚,C++会强制性实行那个束缚,说C++某值维持维持不变。
1 润色一般类别的表达式
const int a = 7;
int b = a; // 恰当
a = 8; // 严重错误,无法发生改变
特别注意:即使自变量在定之后就无法被修正,因此表述时要调用:
const int i; // 严重错误,i未调用
2 润色操作符表达式
const 润色操作符表达式有下列四种情形。
A: const 润色操作符对准的文本,则文本为不容表达式。B: const 润色操作符,则操作符为不容表达式。C: const 润色操作符和操作符对准的文本,则操作符和操作符对准的文本都为不容表达式。对A
const int *p = 8; //8 不容以发生改变,这句话是错的,无法表达式
int a = 1;
const int *p = &a; // p对准的文本不容以发生改变
a = 2; // 恰当,虽然按道理来说p对准的文本不容以发生改变,但是a能发生改变,也就发生改变了p对准的文本*p = 2; // 严重错误,p对准的文本不容以发生改变
对B
int a = 8;
int* const p = &a;
*p = 9; // 恰当
int b = 7;
p = &b; // 严重错误
对C
int a = 1;
const int * const p = &a;
*p = 9; // 严重错误,即使对准的文本不容以发生改变
int b = 2;
p = &b; // 严重错误,即使p操作符本身的文本不容以发生改变
3 润色参数传递
润色参数能分为四种情形
A:值传递的 const 润色传递,一般这种情形不需要 const 润色,即使表达式会自动产生临时表达式复制实参值。
void Cpf(const int a)
{
cout<<a;
// ++a; 是严重错误的,a 无法被发生改变
}
int main(void)
{
Cpf(8);
system(“pause”);
return 0;
}
B:当 const 参数为操作符时,这种情形与上面润色操作符的情形一样,分四种情形
void Cpf(int *const a)
{
cout<<*a<<” “;
*a = 9; // 恰当,即使const这时限定了本身不容以发生改变
a++; // 严重错误,即使a操作符本身不容以发生改变,这时候能防止操作符被意外纂改。
}
int main(void)
{
int a = 8;
Cpf(&a);
cout<<a; // a 为 9
system(“pause”);
return 0;
}
C:自订类别的参数传递,需要临时第一类复制参数,对临时第一类的构造,需要调用构造表达式,比较浪费时间,因此我们采取 const 外加引用传递的方法。
并且对一般的 int、double 等内建类别,我们不采用引用的传递方式。
#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)
{
cout<<_tt.get_cm();
}
int main(void)
{
Test t(8);
Cmf(t);
system(“pause”);
return 0;
}
4 润色codice
分四种情形
A:const 润色内建类别的codice,润色与不润色codice作用一样。
#include<iostream>using namespace std;
const int Cmf()
{
return 1;
}
int Cpf()
{
return 0;
}
int main(void)
{
int _m = Cmf();
int _n = Cpf();
cout<<_m<<” “<<_n;
system(“pause”);
return 0;
}
B: const 修饰返回的操作符或者引用,是否返回两个对准 const 的操作符,取决于我们想让用户干什么。
C: const 润色自订类别的作为codice,此时返回的值无法作为左值使用,既无法被表达式,也无法被修正。
5 润色类核心成员表达式
1 类的核心成员表达式后面加 const,表明那个表达式不会对那个类第一类的数据核心成员(准确地说是非静态数据核心成员)作任何发生改变。有 const 润色的核心成员表达式(指 const 放在auth表的后面,而不是在表达式前面或者参数表内),只能读取数据核心成员,无法发生改变数据核心成员;没有 const 润色的核心成员表达式,对数据核心成员则是可读可写的。
2 自变量(即 const)第一类能调用 const 核心成员表达式,而无法调用非const润色的表达式.
3 两个核心成员表达式如果只是自变量性不同,是能被重载的
class A
{
public:
void f()
{
cout<<“non const”<<endl;
}
void f() const
{
cout<<” const”<<endl;
}
};
4 const 关键字无法与 static 关键字同时使用,即使 static 关键字润色静态核心成员表达式,静态核心成员表达式不含有 this 操作符,即无法实例化,const 核心成员表达式要具体到某一实例。