从常量函数返回引用

时间:2009-01-29 04:36:17

标签: c++ methods const

#include "iostream"
#include "vector"

class ABC {

};

class VecTest {

  std::vector<ABC> vec;

  public:

  std::vector<ABC> & getVec() const { //Here it errors out
      return vec;
  }

};

删除const修复它,不是getVec是常量方法的情况。那为什么不允许这样做?

5 个答案:

答案 0 :(得分:10)

你应该做的是返回一个const引用。

const std :: vector&amp; getVec()const {return vec; }

这是不允许的,因为你说getVec是一个const方法,这意味着该方法不应该以任何方式改变 this 对象。返回非const引用可能允许更改其对象,因此编译器不允许它。

答案 1 :(得分:4)

如果方法是const,则保证编译器无法通过调用方法来更改对象的状态。

如果方法返回对内部成员的引用,则该方法的用户可以通过引用间接更改对象的状态。

因此实际上const方法不能返回引用(因为它允许间接更改对象的状态)。你可以做的是返回一个const引用。因此允许用户访问内部成员但保持合同。

示例:

class X
{
    int&       getX();       // get a reference to X
    int const& getX() const; // get a reference to X BUT the interface guarantees
                             // the object will not change state.
    private:
        int x;
}; 

另一种看待它的方式。
如果你有一个const对象。允许允许调用const方法。如果通过调用const方法,您可以检索对对象内部成员的引用,您可以更改其状态。这会违反原始对象的const(ness)。

答案 2 :(得分:2)

getVec()的返回类型必须为const std::vector<ABC>&

答案 3 :(得分:1)

要添加已经说过的内容,当你创建一个方法const时,它获得的对象实例(this指针)基本上变成了const。请注意,当您返回vec时,您隐式返回this->vec

return this->vec; // it's a const std::vector<ABC> since "this" is const

“Constness”不能被删除 - 除非您使用const_cast<>明确删除它。

// to illustrate what's happening when you're returning from the function
std::vector<ABC> &return = this->vec; // can't assign const to non-const!

因此你的返回类型也必须是const:

const std::vector<ABC> &return = this->vec; // all is good

答案 4 :(得分:0)

要添加Ray Hidayat所说的内容,const方法只能访问类成员。你试图将一个非const引用返回给const成员变量,所以它失败了。

如果您确实需要从const函数访问成员变量的可修改版本,则可以声明变量mutable。不过我不推荐它。