const类型修饰符其实是C++中新引入的,其使用类似于C语言中的deifne关键字,不废话直接讲。
const应用场景有以下六种,掌握了这六种场景,以后见到const就不怵了。
(一)const变量
const int a = 1; //定义时赋值
对变量a进行修饰,表示a是const类型的,需要定义是赋值,而且后面不能再赋值,可以赋值给变量;
int a = 1;
const int b = a; //定义时赋值,”const int b“编译会报错
b = 2; //error,不能修改const类型的值,其值在定义时就确定了
(二)const引用
const修饰引用,看const和&的位置,表明引用值是不能修改的;
场景一:
int a = 1;
const int& b = a; //等价于int const & b =a ;看const和&位置,表明是修饰int&类型的
b = 2; //error,b是const引用类型,其值不能改
a = 3; //可以通过修改a间接修改b,此时b等于3
场景二:
int & d = 1; //error,1可以看作是一个const类型,报错原因参考CC定律
const int &d = 1; //OK
(三)const指针
const指针主要通过看const和*的位置来区分不同的应用场景
场景一:
const int* a = &b; //等价于int const * a; const修饰*a,即*a不能做左值
*a = 1; //不能当左值
场景二:
int* const a = &b; //const修饰a,a不能做左值
a = &c; //不能当左值
场景三:
const int* const a = &b; //等价于int const* const a = &b; *a, a都不能当左值
*a = 1; //不能当左值
a = &b; //不能当左值
上面只列出了不能当左值的例子,当然只要没说的都可以当左值啦。
(四)const函数形参
主要通过形参与实参之间的调用关系来划分不同应用场景
场景一:
形参不是const类型时,不管实参是不是const类型,随便调
void func(int a);
const int b = 1;
func(b); //OK
场景二:
形参是const类型时,如果不是指针或引用,不管实参是否是const类型,随便调
void func(const int a);
int b = 1;
func(b); //OK
形参是const类型时,如果时const指针或引用,实参必须是const类型指针或应用,否则编译失败(参考CC定律)
void func(const int* a);
int* b = &c; //应该改为const int* b = &c;同理const int& b = c;
func(b); //error
(五)const函数返回值
const修饰返回值,如果是非指针类型,则忽视const存在
const int func();
int a = func(); //OK
const修饰返回值,如果是指针或引用类型,则必须用const指针或引用来接受此返回值(参考CC定律)
const int* func();
int* a = func(); //error,应改为const int* a = func();同理const int& a = func();
(六)const类成员函数
const修饰类成员函数,不能修改成员变量值,只能调用const同类型成员函数,注意const位置,写在成员函数后面,就表示此函数是const成员函数,记住上面说的两点一点问题没有
void A::func(int a, int b) const;
原理是this指针的引入,其实所有的类成员函数都包含一个隐士的this指针调用
void A::func(A* this, int a, int b); //通过*this.private来调用私有成员变量,如果是const成员函数其显示形式为:
void A::func(const A* this, int a, int b) const; //显然此时*this不能修改其值,当然为了不通过成员函数间接修改成员变量的值,只能调用const同类型成员函数
CC定律:const指针和引用相关的问题都可以用下面两条来解释
-)const int* a = &b;//b为const类型,a指针必须是const类型(很显然a,b指向同一段内存空间,b是const类型,即b的值不能修改,但是如果a不是const类型指针,可以通过修改*a间接修改const类型的b的值,所以这里*a必须也是const类型的)
-)const int& a = b;//b为const类型,a引用必须是const类型(很显然a是b的别名[其实质也是a,b指向同一段内存空间],b是const类型,即b的值不能修改,但是如果a不是const类型,可以通过修改a间接修改const类型的b的值,所以这里a的引用必须也是const类型)
满满的干货,所有const应用场景!