把文章中的相关部分独立出来。
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传进去