[英]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.