有人可以解釋這段代碼嗎?我不明白第3行:令人困惑的涉及* this的C++代碼?
MyString MyString::operator+(const MyString &str)
{
MyString ss(*this); //----> explain this part
ss += str;
return ss;
}
謝謝!
有人可以解釋這段代碼嗎?我不明白第3行:令人困惑的涉及* this的C++代碼?
MyString MyString::operator+(const MyString &str)
{
MyString ss(*this); //----> explain this part
ss += str;
return ss;
}
謝謝!
此代碼:
MyString ss(*this);
說「聲明MyString
類型的命名ss
的新變量,並將其初始化爲*this
的副本。」在成員函數內部,this
是一個指向接收者對象(成員函數正在作用的對象)的指針,因此*this
是對接收者對象的引用。因此,您可以將其讀作「創建一個名爲ss
的新的MyString
,並且是接收方對象的副本。」
這裏使用的習慣用法是根據operator +=
執行operator +
。這個想法是複製接收者對象,使用operator +=
將參數添加到副本,然後返回副本。這是一個廣泛使用的技巧,通過實施相應的複合賦值運算符,簡化獨立運算符的實現。
希望這會有所幫助!
這是一個MyString
的構造函數,它將當前對象(類型爲MyString
)的值作爲其參數。
從我可以告訴,這是一個複製構造函數創建一個新的MyString與當前MyString對象的內容。
ss
是一個新的字符串,它是從原始字符串中用複製構造函數構造而成的。
這是通用代碼重用技術的一個實例,用於實現另一個操作符。
假設我們已經定義了一個複合加上運營商:
class X
{
X & operator+=(const X&);
};
這種一元運算符允許我們編寫a += b
,它修改a
並返回到自身的引用。這很好,很好。現在,如果我們還想提供一個複製二進制加操作符a + b
,它將按值返回一個新值,並且保持a
和b
不變,那麼我們要利用我們已經爲複合操作符編寫的代碼。我們通過調用一元運算符上的a
一個臨時副本這樣做:
X X::operator+(const X & b) const { return X(*this) += b; }
^^^^^^^^
temporary copy
這是你的代碼做什麼,更多的只是有點冗長。你也可以寫下return MyString(*this) += str;
還有其他的習語遵循類似的精神,比如在常量訪問方面實現非const訪問,複製構造和交換方面的copy-assign,以及move-assign在移動構建和交換方面。它總是歸結爲避免代碼重複。
問題中的'operator +'不是獨立的,它是成員操作符 - 否則不會有'this' :-) –
對不起,我的意思是「不是複合賦值版本」。這可能不是最好的術語。 :-) – templatetypedef
@templatetypedef:「非變異」:) – GManNickG