2011-08-10 34 views

回答

11

此代碼:

MyString ss(*this); 

說「聲明MyString類型的命名ss的新變量,並將其初始化爲*this的副本。」在成員函數內部,this是一個指向接收者對象(成員函數正在作用的對象)的指針,因此*this是對接收者對象的引用。因此,您可以將其讀作「創建一個名爲ss的新的MyString,並且是接收方對象的副本。」

這裏使用的習慣用法是根據operator +=執行operator +。這個想法是複製接收者對象,使用operator +=將參數添加到副本,然後返回副本。這是一個廣泛使用的技巧,通過實施相應的複合賦值運算符,簡化獨立運算符的實現。

希望這會有所幫助!

+0

問題中的'operator +'不是獨立的,它是成員操作符 - 否則不會有'this' :-) –

+0

對不起,我的意思是「不是複合賦值版本」。這可能不是最好的術語。 :-) – templatetypedef

+0

@templatetypedef:「非變異」:) – GManNickG

1

這是一個MyString的構造函數,它將當前對象(類型爲MyString)的值作爲其參數。

1

從我可以告訴,這是一個複製構造函數創建一個新的MyString與當前MyString對象的內容。

1

ss是一個新的字符串,它是從原始字符串中用複製構造函數構造而成的。

3

這是通用代碼重用技術的一個實例,用於實現另一個操作符。

假設我們已經定義了一個複合加上運營商:

class X 
{ 
    X & operator+=(const X&); 
}; 

這種一元運算符允許我們編寫a += b,它修改a並返回到自身的引用。這很好,很好。現在,如果我們還想提供一個複製二進制加操作符a + b,它將按值返回一個新值,並且保持ab不變,那麼我們要利用我們已經爲複合操作符編寫的代碼。我們通過調用一元運算符上的a一個臨時副本這樣做:

X X::operator+(const X & b) const { return X(*this) += b; } 
              ^^^^^^^^ 
              temporary copy 

這是你的代碼做什麼,更多的只是有點冗長。你也可以寫下return MyString(*this) += str;

還有其他的習語遵循類似的精神,比如在常量訪問方面實現非const訪問,複製構造和交換方面的copy-assign,以及move-assign在移動構建和交換方面。它總是歸結爲避免代碼重複。