c ++ const成员函数返回对类成员的引用

mik*_*sol 3 c++ reference

如果我有类成员函数:

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成员函数中返回一个常量指针.为什么是这样?

Mic*_*yan 6

声明函数时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保证.