2009-01-29 110 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