1、const修饰变量,表示变量不能被改变,并且变量必须初始化,
const int N=100;
N=200;//错误,N不能被改变
const int i;//错误,i未能初始化
2、const初始化引用用法,可以使const引用绑定到一个非左值上
C++允许这么做,是因为const引用将创建一个临时变量,并且允许绑定
int &i=2;//错误,左值引用只能绑定左值,不允许绑定一个右值
const int &j=2;//正确,常量引用可以绑定到非左值上
int ii=222;
const double &iii=ii;//可以转化类型也是正确的
3、顶层const和底层const
用const 和指针同时使用有两种情况
int i=2;
const int* ii=&i;
int* const iii=&i;
第一种情况就是底层const
const 修饰的是指针ii指向的i,ii的地址可以改,但是不可通过ii去改i的值
第二种情况就是顶层const
和第一种相反,iii的地址不可以改,但是却可通过iii去改i的值
是不是有点相似感,左值引用就是指针常量也就是第二个情况
4、const应用到类中
用const修饰该对象,不允许对象中的成员变量被修改
class A{
public:
int a=2;
void seta(int b){
a=b;
}
int geta(){
return a;
}
};
int main(){
const A n;
n.a=3;//错误
return 0;
}
用const修饰该对象,不允许对象调用非const成员函数
class A{
public:
int a=2;
void seta(int b){
a=b;
}
int geta(){
return a;
}
};
int main(){
const A n;
n.seta(10);//错误
std::cout<<a.geta()<<'\n';//错误
return 0;
}
用const修饰该对象,允许对象调用const成员函数,但还是不允许改变成员变量
class A{
public:
int a=2;
void seta(int b)const{
a=b;
}
int geta()const{
return a;
}
};
int main(){
const A n;
n.seta(10);//错误,还是不允许改变成员变量
std::cout<<a.geta()<<'\n';//正确,可以调用
return 0;
}
原因就是调用seta()函数时候调用了this指针,而this指针被const修饰不允许this->a=b去改变成员变量。