收集了别人关于 const 的一些论述。
const 的用法很多很灵活,稍不注意,就会有些莫名其妙的问题出现。
甲:用于定义一个不能被更改的变量的时候:
const int i = 10; // i 的值不能被改变,否则报错
void fun ( const int i ) { ......... } // 在函数中,i 的值不能被改变,即使他是个局部变量。
或
int a = 10;
int b = 90;
const int *p = &a;
//int const *p = &a;
//const在 * 前即可,
*p = 99; //报错
a = 99; //可行
p = &b; //可行
//此时指针指向的内容具有 const 性,它所指向的地址的内容是不能通过指针改变,但是指针指向的地址是可变的。
或
int a = 10;
int b = 90;
int* const p = &a;
*p = 99; //可行
a = 99; //可行
p = &b; //报错
//此时指针作为一个变量,具有 const 性,这个指针变量是不能改动的,只能指向这个地址,但是地址中的内容是可变的。
或
int a = 10;
const int* const p = &a;
a = 785; //可行
*p = 15; //报错
p = &b; //报错
//综合前二者,指针指向的地址,和地址中的内容都是不能变的,指针等于这个变量的一个别名,变量的内容不能通过指针改变。
指针使用const时,如果const在* 的左侧,即为指针指向常量;const在* 的右侧,即为指针是常量。
函数参数表中带const 的参数也并非绝对不能修改,比如指针类型的就可以通过把这个const指针赋值给另一指针,然后修改新建指针指向的内容,绕过const指针。到目的。
乙: 类中的const
类成员的const:
class
{
const int a; //只能在初始化列表中赋值,而后就不能更改
类成员函数的const:
如:
class X
{
int a;
int b;
public:
X(int x, int y):a(x),b(y) {}
int get() {return a; }
int get() const {return b; }
};
const X x1(0,9);
X x2(0,9);
cout << x1.get() << "\t" << x2.get() << endl;
可见,x1 调用的是int get() const,x2 调用的是 int get();另外,加了const的函数,不能对类的数据成员作出更改;
另外,const的成员函数,不能调用非const的成员函数;
另外,用mutable关键字修饰过的成员变量可以在声明为const 函数中被改变;
另外,非const对象可以调用const函数,而const的对象,不能调用非const的函数。
例如:class X
{
int a;
int b;
public:
c(int x, int y):a(x), b(y){}
int get() {return b;}
};
const X X1(8, 9);
X X2(1, 2);
cout << X1.get() << endl;
cout << X2.get() << endl;
输出X1.get()会报错,
对于const成员函数的解释是,函数会获得一个this指针,而const成员函数,获得的this指针是const的,本质上还是一种参数的重载,
丙:函数参数使用const
如:
void fun(const int i)
//无意义,因为本身就是形参
void fun(const int *p)
//指针指向的内容是常量,不可变
void fun(int * const p) //无意义,形参
void fun(const int &i) //参数为引用,也是为了防止改变
丁:
更详细参见 http://blog.youkuaiyun.com/Eric_Jo/article/details/4138548