簡體   English   中英

我可以使用const成員函數返回* this並使用非常量對象嗎?

[英]Can I have a const member function that returns *this and works with non-constant objects?

如果我理解正確,應該將不應該修改對象的成員函數聲明為const以便讓用戶知道保證。 現在,當該成員函數返回對*this的引用時會發生什么? 例如:

class C{
public:
    C &f() const {return *this;}
};

C::f()this的類型為const C* ,因此,以下內容不會編譯:

int main() {
    C c; // non-constant object!
    c.f();
    return 0;
}

當然,我們可以提供非常量版本的C::f()來處理非常量對象:

class C{
public:
    const C &f() const;
    C &f();
};

但是,我不相信這是我們想要的。 請注意,非常量版本不會更改對象,但是對用戶的這種承諾沒有表達出來......我錯過了什么?

編輯:為了清楚起見,我只是總結一下這個問題: f()不修改調用它的對象,因此將其聲明為C &f(); 不使它成為const成員是誤導。 另一方面,我確實希望能夠在非const對象上調用f() 我該如何解決這種情況?


編輯:它來自評論中發生的所有討論,該問題是基於對函數成員的const所暗示的錯誤理解。 我正在為自己帶走的正確理解是:

返回非const引用的成員函數旨在允許其用戶通過返回的引用更改對象。 因此,即使此函數本身不更改對象,也不應該將它聲明為const成員!

您的問題是原始函數定義:

C &f() const {return *this;}

在這里你返回一個對const對象的非const引用,這將允許更改const對象並且是危險的,因此它是被禁止的。

如果你把它寫成

const C &f() const {return *this;}

可以從const和非const對象調用,並且總是返回一個const引用。

當然,我們可以提供一個非常量版本的C :: f()來處理非常量對象。 但是,我不相信這是我們想要的。

可能這正是你想要的。 它是在非const對象上調用時返回非const引用的唯一方法,並且在const對象上調用const時保持const正確性。

暫無
暫無

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

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