定义变量时,保持变量值不变。基本命令是:
const int i = 512;
const int i = get_size();
const对象必须初始化
1. 默认状态下,const对象仅在文件内有效
const对象默认在文件内有效,当多个文件中出现同名const变量时,等于是在不同的文件中分别定义了独立的变量。
解决办法是,对于const变量不管声明还是定义均添加extern关键字。
2. const的引用
引用的类型必须是常量型。
const int ci = 1024;
const int &ri = ci;//正确
int &r2 = ci;//错误,r2是非常量引用
引用的类型必须和其所引用的对象的类型一致,且不可引用字面值或某个计算结果,有两个例外:
- 初始化常量引用时允许用任意表达式作为初始值,只要该表达式能够装换成引用的类型即可。
int i = 42;
int &ri = i;
const int &r2 = i;//r2是对非常量的引用,
//不可以通过r2修改i,但是可以通过ri修改
2.【后续】
3. 指针和const
3.1 指向常量的指针
const int i = 12;
int i1 = 10;
int *j = &i;//错误,j不是指向常量的指针
const int *j1 = &i;//正确
const int *j2 = &i1;//正确,指向常量的指针也可以指向一个非常量,类似引用
3.2 const指针
指针本身是不可改变的。
int i = 0;
int *const j = &i;//j将一直指向i的地址
const int k = 1;
const int *const m = &k;//m是一个常量指针,同时指向一个常量
3.3 顶层const
顶层const(top-level const)是指指针(对象)本身是常量,底层const(low-level const)表示指针所指对象是常量。
4. const和函数
4.1 const和函数的参数
4.2 const和函数的返回值
4.3 const成员函数
来自http://www.2cto.com/kf/201312/266471.html
class Test(){
public:
Test(){}
const int foo(int a);
const int foo(int a) const;
};
概念
当const在函数名前面的时候修饰的是函数返回值,在函数名后面表示是常成员函数,该函数不能修改对象内的任何成员,只能发生读操作,不能发生写操作。
原理
我们都知道在调用成员函数的时候编译器会将对象自身的地址作为隐藏参数传递给函数,在const成员函数中,既不能改变this所指向的对象,也不能改变this所保存的地址,this的类型是一个指向const类型对象的const指针。
Overload时const的作用
继续使用上面的test类:
int main(int argc, _TCHAR* argv[])
{
Test obj;
const Test obj1;
obj.foo(3);//使用非const函数
obj1.foo(3);//使用const函数
}
在VS中如果对象不是const,则调用非const的函数。