目录
const 是 C++ 中的一个修饰符,就 const 修饰符而言,它用来告诉编译器,被修饰的这些东西,具有“ 只读 ”的特点,在编译中一旦代码试图去改变这些东西,编译器就会给出错误提示,所以使用const,能帮助我们规避很多错误,提高程序正确率。
1. const 变量
const 变量:此变量的值是只读的,不能被改变,且在定义时必须初始化。
const int a = 10;
const int b; // 编译错误:未初始化const变量
a = 5; // 编译错误:给只读变量赋值
C++中,const 全局变量被用来替换一般常量宏定义。因为虽然 const 变量的值不能改变,但是依然是变量,使用时依然会进行类型检查,要比宏定义的直接替换方法更严格。
2. const 类对象
const类对象:此类对象的值是只读的,不能被改变。(在C++中, struct 与 class 除了默认访问权限之外,并无本质区别,所以 struct 结构体也同样的)
const Student s1;
改变任何成员变量的值,调用任何非const成员函数都是不允许的。
3. 指向 const 变量的指针
指向 const 变量的指针:是一个指向 const 变量的指针,其中保存着一个 const 变量的地址,指针指向的内容不能改变,但是指针的指向可以改变。
int a = 10;
const int* b = &a; //指向变量的值不能改变
int c = 20;
b = &c; //指针的方向可以改变
cout << *b << endl; //输出 20
4. const 指针
const指针:一个经 const 修饰的指针,指针指向不能发生改变。
int a = 10;
int* const b = &a; // const 指针必须初始化,且其指向不能改变
*b = 20; // const 指针指向的内容可以改变
int c = 30;
b = &c; //报错,不能修改 const 指针的指向
5. 指向 const 变量的 const 指针
指向 const 变量的 const 指针:即 const 指针和指向 const 变量的指针的结合,既不能改变指针的指向,又不能改变指针指向的内容。
int a = 10;
const int* const b = &a; //既不能改变指针的指向,又不能改变指针指向的内容
6. 指向 const 变量的指针和 const 指针补充
const默认先作用于左边的东西,否则作用于右边的东西。只要一个数据类型或者符号就可以判断
- const int* :左边没有东西,const右边是 int ,代表 int 值(内容)不可变,* 代表指向一个整型。所以不可以改变指针指向的值(内容),但是可以改变指针的指向;
- int const *:const左边是 int ,代表 int 值(内容)不可变,* 代表指向一个整型,效果同上;
- int* const:const的左边是 * ,代表指针指向不可变,int 代表指向一个整型的指针。所以不可以改变指针的指向,但是可以改变指针指向的值(内容);
- const int* const:左边 const 左边没东西,右边是 int ,代表 int 值(内容)不可变,右边 const 左边是 * ,代表指针指向不可变。所以既不可以改变指针指向的值(内容),又不可以改变指针的指向;
-
int const * const:左边 const 左边是 int ,代表 int 值(内容)不可变,右边 const 左边是 * ,代表指针指向不可变。效果同上。
7. const 变量作为函数参数
将函数参数声明为 const 类型,那么函数内部就不能够改变这个参数的值。如果函数的参数是一个指针,一般我们将其设置为指向 const 变量的指针,即不允许函数内部对参数指向的内容进行更改操作。
//值传递
void func(const int a) {
a = 10; //编译错误,不允许修改!
cout << a << endl;
}
//地址传递
void func(const int* a) {
*a = 10; //编译错误,不允许修改!
cout << a << endl;
}
//引用传递
void func(const int& a) {
a = 10; //编译错误,不允许修改!
cout << a << endl;
}
8. const 返回值
const 型的返回值:指的是函数的返回值为一个 const 变量。函数返回const返回值,主要用于函数返回const引用。
引用是一个对象的别名,相当于 const 指针,其指向一经确定,就不能改变了。而 const 引用,则相当于指向 const 变量的 const 指针,其指向和指向的内容均不允许改变。所以在函数返回 const 引用时,不能够通过 函数返回的引用 对实际对象进行任何修改,即便对象本身不是 const 的。
const int& func01(int& a) {
a = 10;
return a;
}
int& func02(int& a) {
a = 10;
return a;
}
int main() {
int a = 0;
//func01(a) = 20; //编译错误,表达式必须是可修改的左值
func02(a) = 20;
cout << a << endl;
return 0;
}
9. const 成员变量
const 成员变量:指的是类中的成员变量为只读,不能够被修改(包括在类外部和类内部)。
const 成员变量必须被初始化(在相关构造函数的初始化列表中),初始化后,不能够被修改。
静态 const 成员变量需要在类外部单独定义并初始化(可定义在头文件)
10. const 成员函数
const成员函数:此函数不应该修改任何成员变量。
传给const成员函数的this指针,是指向 const 对象 的 const 指针。
const成员函数,不能够修改任何成员变量,除非成员变量被 mutable 修饰符修饰。