如何获取对象的const引用并使用该引用更改对象(使用const_cast)?

时间:2011-12-13 02:51:28

标签: c++ oop const-cast

我有一个成员函数返回const对类实例的引用。

示例:

class State
{
  const City* city1;
public:
  State(const City& c) : city1(c) {}
  const City& getReference() const {return *city1;}
  void changeStuff();
};

如何使用const_cast和getReference()获取指向city1的非const City *

此外,通过执行以下操作,我可以在不使用const_cast的情况下实现我想要的目标: (假设已经存在一个名为state1)的状态实例

City ref = state1.getReference(); //Why does it work?
City * ptr = &ref; //This is what I wanted, but not this way
ref->changeStuff(); //How can I call functions changing things if the reference was constant?

如何从返回const引用的函数中获取非const引用,甚至可以调用setter?

感谢您的关注

2 个答案:

答案 0 :(得分:3)

City ref = state1.getReference(); //Why does it work?

它有效,因为那不是参考。你正在复制const值。试试这个:

City & ref = state1.getReference();

那不行。你可以像这样使用const cast:

City * ptr = const_cast<City*>(&state1.getReference());

确保对象不是真正的const。否则,实际尝试修改它是未定义的行为。

答案 1 :(得分:0)

如果你声明了某些东西是const,就像你对编译器做出承诺一样,你永远不会改变那个东西的内容,你为什么要那样做呢?

如果你真的想要改变const类型的东西,你必须声明mutable

class A
{
public:
mutable int _change_me;
};

现在您可以更改成员_change_me,即使您有class A的const引用。