簡體   English   中英

從成員get方法返回const引用

[英]Returning const reference from a member get method

typedef vector<int> intvec;

class MyClass
{
    intvec m_member;
public:
    const intvec& GetVec();
};

const intvec& MyClass::GetVec()
{
    return m_member;
}

int main(int argc, char *argv[])
{
    MyClass myClassObj;

    myClassObj.GetVec().push_back(11); //This doesn't work with const reference
    myClassObj.GetVec().push_back(22); //This doesn't work with const reference

    for(intvec::const_iterator iter = myClassObj.GetVec().begin(); iter != myClassObj.GetVec().end(); ++iter)
    {
        cout << *iter << ", " ;
    }

    cout << endl;

    system("PAUSE");
    return EXIT_SUCCESS;
}

如果GetVec()的返回類型是非const引用,則myClassObj.GetVec().push_back(11); 可以,但是對於const引用返回則不起作用(編譯錯誤)。 我知道,如果GetVec()方法本身是const,即const intvec& GetVec() const; ,然后是myClassObj.GetVec().push_back(11); 無效,因為那將意味着修改“ this”指針。

您可以在const限定條件上重載該函數:

const intvec& GetVec() const;    // Can access, but not modify, a const object
intvec& GetVec();                // Can access or modify a non-const object

或者,您可以只公開數據成員並具有完全相同的限制。 除非用於限制訪問或維護類不變式的訪問器函數,否則訪問器函數沒有什么意義。

預期不能在const引用上使用類似push_back這樣的修改功能。 假設push_back是將項目附加到數組的東西,構成對對象的修改,因此,如果對象是常量,則不能這樣做。

我知道,如果GetVec()方法本身是const即const intvec&GetVec()const ;,則myClassObj.GetVec()。push_back(11); 將不起作用,因為那將意味着修改“ this”指針

這是對的。 而且,getter函數應具有const,以防止您修改“ this”。

const intvec& MyClass::GetVec() const { return m_member; }

通常使用吸氣功能讀取數據。 如果需要,您的類(m_member的所有者)應該是修改該成員的類。 如果可以從類外部修改成員,則會失去對更改m_member的時間和對象的控制(使調試變得困難,並降低了開發人員的可讀性)。

如果要更改m_member,通常會在類中添加一個方法。

如果GetVec()的返回類型是非const引用,則myClassObj.GetVec()。push_back(11); 可以,但是對於const引用返回則不起作用(編譯錯誤)。

您根本無法將元素壓入const向量,因為那樣就不會是const向量:)。 我認為您對const關鍵字有些困惑。

const object-類型為const限定的對象,或const對象的不可更改子對象。 不能修改此類對象 :直接嘗試這樣做是編譯時錯誤,而間接嘗試這樣做(例如,通過對非const類型的引用或指針修改const對象)會導致未定義的行為。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM