Introduction
在C++中,const的使用十分令人confusing。一般来说,const修饰哪个部分,直接看其左边的,如果左边没东西,就看其右边的。
Basic
int const a = 8;
const int a = 8;
最基本的用法就是直接修饰一个变量,使其成为常变量,必须在定义时初始化,且后续不能修改其值。
int const * a = 8;
const int * a = 8;
int * const a = 8;
当const与指针或者引用一起连用时(在函数传参时经常用到),前两种用法是等同的,均表示指向常变量的指针,此时不能通过指针来修改其指向的内容的值,但是该指针可以改为转向其他任意变量或者常变量。第三种情况表示指向变量的常指针。
Object Oriented
class A {
private:
int w, h;
const int c_w; //常数据成员必须在参数列表中初始化,任何函数不能对其赋值<br/>
public:
int getValue() const { //常成员函数不可以改变数据成员的值,不能调用非常成员函数,在实现部分也要加const<br/>
return w * h * c_w;
}
int getValue() { //普通成员函数,但可调用常成员函数<br/>
return w + h + c_w;
}
//构造函数\
A(int x, int y, int z): c_w(z) {
w = x;
h = y;
}
};
int main() {
A a(3, 4, 5); //普通对象,既可调用普通成员函数,也可调用常成员函数,但函数有重载,默认调用普通成员函数<br/>
const A b(3, 4, 5); //常对象,只能调用常成员函数,必须在声明的时候初始化<br/>
cout << a.getValue() << endl; //out: 12
cout << b.getValue() << endl; //out: 60
}
用法已经写在注释里,明确一点即可:定义为const的不论是成员函数还是对象,都是不可改变的,因此他们不能调用普通的成员函数。
Conclusion
一般情况下,在函数的参数传递时都习惯使用const pointer常指针或者const reference常引用,既可以避免子函数对变量的修改,又可以避免建立实参拷贝,提高程序运行效率。