在c++中,const关键字用于声明常量。
const的五个使用场景
1.声明变量
定义一个不能被修改的变量
例如:
const double PI = 3.14;
2.指向const的指针
const int var = 10;
const int* p = &var;
const指针与指针对比请看指向const成员(变量)的指针
3.常量参数
防止函数内部修改传入的参数
void func(const string& str) {
// 这里不能修改str
}
4.常量成员函数
class MyClass {
int val;
public:
int getVal() const {
return val;
}
}
getVal()被声明为常量函数,不能修改val
不要写成const in getVal(),那代表了getVal()返回的是const
5.常指针
相比于「指向const变量的指针」,本身无法修改的指针才更加具有魅力!
int * const ptr = &x;
但是x
并非只读。
6.组合拳:指向const对象的const指针
const int * const ptr = &x;
这时ptr
既是const
指针,又是指向const int
,即ptr
本身不能修改,也不能通过ptr
修改x
指向const成员(变量)的指针
在理解这一块之前,可以先去理解什么是指针,什么是指针变量
方便理解,所谓指向const变量的指针就是(const type)* ptr = &var;
const type
是一个整体,并非是const
修饰type* ptr
,而是 *
修饰 const type
下面是一个普通的解引用改变值的例子:
char c = 's';
char* ptr = &c;
*ptr = 'd';
std::cout << *ptr <<endl;
- 首先定义了字符变量
c
,值为's' - 获取变量
c
的地址,赋值给指针ptr
- 解引用
ptr
指针,可以访问它指向的内存,即变量c
的内存 - 通过解引用将c的内容修改为'd'
- 再次解引用
ptr
打印出其指向的字符,此时是'd'
但如果我们加入const,则是另一种结果:
const char c = 's';
const char* ptr = &c;
*ptr = 'd';
std::cout << *ptr <<endl;
这时候会提示
assignment of read-only location ‘* ptr’