const 是不变的,不易改变的意思。在 C++ 中可用来修饰内置类型变量、自定义对象、成员函数、返回值、函数参数。
const使用
const可以保护修饰的对象,防止意外修改;并有助于优化,提升性能(如const常量可能都不需要为其分配内存)。
定义常量
const修饰的变量为常量(声明时必须初始化),与宏类似,但更安全。以下两者方式是等价的:
<TYPE> const name = value;
const <TYPE> name = value;
作为外部连接时(声明时可以不初始化,此时一定会为其分配内存),会扩大至全局:
// test.cpp
extend const int DefSize=10;
// <other>.cpp
extend const int DefSize;
指针
指针本身是常量:
char* const pValue;
指针指向的内容是常量:
const char *pValue;
指针与内容都为常量:
const char* const pValue;
函数
修饰参数
修饰参数,禁止修改(对于形参无意义)。
对于指针参数,规则与上节指针部分相同:
void fun(const char* const pValue)
修饰引用参数(增加效率同时,避免被修改):
void fun(const <TYPE>& pValue);
void fun(const <Class>& pValue)
修饰返回值
避免函数返回的内容被修改:
const int* fun(...);
转换为非const
一些情形下,需要把const类型转换为非const(此时要保证不要修改对应内容):
const_cast(expression)
const成员函数
以下是对象与成员函数是否加const时的关系:const对象是不允许调用non-const成员函数的。当成员函数中同时存在const与non-const版本时(const函数与非const函数间是可以重载的):
- const对象只会调用const版函数;
- non-const对象只会调用non-const版本函数;
const | const object (data memebers不能修改) | non-const object (data memebers可修改) |
---|---|---|
const member function (保证data不变) | ✔ | ✔ |
non-const member function (不保证data不变) | ✘ | ✔ |
字符串中(修改是通过COW(Copy On Write)方式实现的)中const与非const重载示例:
charT operator[](size_type pos)const{
// ... // 不需要考虑COW
}
reference operator[](size_type pos){
// ... // 需要考虑COW
}