C++ 中 const 的用法

文章中的相关部分独立出来。

const不是编译期常量

C++初始化方式中已经提到常量const是不能在构造函数体中初始化的,但可以在初始化列表中可以进行初始化,对于常量数组或者标准库的std::vector等容器,现在可以使用花括号{}进行初始化。
需要额外说明的是const甚至不能作为模板参数等编译期常量使用。例如在MSVC2015中,下面的代码是无法通过编译的

1
2
3
4
5
6
7
8
9
10
11
12
struct C {
const int x;
C(int _x) :x(_x) {

}
};

int main() {
const C c(1);
int a[c.x];
system("pause");
}

原因是在C.x虽然是常量,但是要到运行期才能知道,这里应该使用的是static const或者constexprconst修饰符实际上的意义更接近于readonly。如果说const能够“节省空间”,那是由于其不可变,所以发生拷贝时,const对象实际上并不发生复制,但只const修饰的类成员仍然是占空间的。

实现member function的const版本

有些member function的const版本相对于非const版本只是加上了const的限制,重复实现一遍会造成代码的浪费。根据stackoverflow,可以直接const_cast this指针即可。对一个非const加const限制是安全的,但反过来不一定。如果说const函数需要修改非mutable成员,那么可以实现一个static非成员模板函数,将this传进去