2009-01-29 74 views
1
#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是一个常量方法。那为什么不允许?从常数函数返回引用

回答

10

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

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

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

2

返回类型getVec()需要为const std::vector<ABC>&

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方法,您可以检索对象的内部成员的引用,您可以更改其状态。这会违反原始对象的常量(ness)。

0

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

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

1

要添加到已经说过的内容中,当您创建一个const方法时,它所获得的对象实例(指针this)基本上变为const。请记住,当你返回vec,你含蓄地返回this->vec

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

“不变性”不能带走 - 除非你明确地把它拿走了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