如果我有类成员函数:
bar* foo::get_value() const
{
return &_value;
}
Run Code Online (Sandbox Code Playgroud)
编译器会抱怨
无法使用类型为const bar*的右值初始化bar*类型的变量
_value不在const课堂上.
如果我有这个功能:
bar* foo::get_value() const
{
return const_cast<bar *>(&_value);
}
Run Code Online (Sandbox Code Playgroud)
它工作得很好.
我认为声明一个成员函数常量意味着你保证不修改类的内部内容,但操作&似乎在const成员函数中返回一个常量指针.为什么是这样?
声明函数时const,您说这是一个在对象的非const和const实例上都允许的函数.因为它可以在const实例上调用,所以该函数不应该改变该对象.当您向内部对象返回非const引用时,您将为调用者提供间接改变对象内部状态的方法.要解决此问题,请返回一个常量对象.
换句话说,而不是:
Bar* Foo::GetBar() const
Run Code Online (Sandbox Code Playgroud)
做:
const Bar* Foo::GetBar() const
Run Code Online (Sandbox Code Playgroud)
或者,更好的是:
const Bar& Foo::GetBar() const
Run Code Online (Sandbox Code Playgroud)
正如您所观察到的,const_cast允许您破坏对象的常量.一般来说,你应该避免使用const_cast; 使用它是一种代码气味,它破坏了预期的const保证.