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 传进去。