把文章中的相关部分独立出来。
const不是编译期常量
在C++初始化方式中已经提到常量 const
是不能在构造函数体中初始化的,但可以在初始化列表中可以进行初始化,对于常量数组或者标准库的 std::vector
等容器,现在可以使用花括号 {}
进行初始化。
需要额外说明的是 const
甚至不能作为模板参数等编译期常量使用。例如在 MSVC2015 中,下面的代码是无法通过编译的
1 | struct C { |
原因是在 C.x
虽然是常量,但是要到运行期才能知道,这里应该使用的是 static const
或者 constexpr
,const
修饰符实际上的意义更接近于 readonly
。如果说 const
能够“节省空间”,那是由于其不可变,所以发生拷贝时,const 对象实际上并不发生复制,但只 const
修饰的类成员仍然是占空间的。
实现member function的const版本
有些 member function 的 const 版本相对于非 const 版本只是加上了 const 的限制,重复实现一遍会造成代码的浪费。根据stackoverflow,可以直接 const_cast
this
指针即可。对一个非 const 加 const 限制是安全的,但反过来不一定。如果说 const 函数需要修改非 mutable 成员,那么可以实现一个 static 非成员模板函数,将 this 传进去。