2013-02-14 121 views
0

我正在構建一個用於處理複數的C++程序。 我有問題,此代碼的行爲:指針或引用

Complex& Complex::operator=(const Complex& com) 
{ 
    Complex::re_=com.re_; 
    Complex::im_=com.im_; 
    return *this; 
} 

現在,這個函數的返回類型是複雜類型的參考。所以我不應該通過this而不是*this

+0

爲什麼標記爲c? – banuj 2013-02-14 11:12:03

+0

不,'this'是一個指向'Complex'實例的指針,需要引用'return'。 – hmjd 2013-02-14 11:12:26

回答

5

this指針是您的對象實例的地址。

使用星號來取消引用它。

0

與Java和C#不同,this不是C++中的引用,它是一個指針。該指針的類型爲Complex*Complex const*,具體取決於方法上的const限定符(因此在您的情況下爲Complex*)。

編輯:如在評論中指出,Java和C#的引用都不是容易比得上C++引用和poitners,所以讓我澄清一下:

句法,這三種語言的引用對待它們是相同的,也就是說它們不需要被解除引用或者被隱式引用,或者簡單地說,你可以訪問它後面的對象,如ref.method()

語義上,,普通的Java和C#引用的行爲與C++指針類似,即它們可以爲空,並且它們可以被重新分配以指向另一個對象。在C++中,引用都不可能。所以乍一看,Java和C#中的this具有C++指針語義,就像它在C++中一樣。但是由於它不可能是null並且不能被重新分配指向另一個對象,所以這種語義差別消失了,並且它在所有三種語言中都具有相同的C++引用語義。

所以,換句話說相同的答案: 雖然this有引用語義,它在語法上是C++中的指針,所以你必須明確地取消對它的引用獲得(語法)的參考。

+1

'this'是一個指針,因爲它可以是NULL。 (它不應該,但它可以。) – 2013-02-14 11:19:54

+0

不,這個''不能是NULL,我是一個符合標準的方法。如果你調用一個空指針的方法,你會得到UB。所以這不是使這個指針成爲一個有效的理由。在引用空指針時不會崩潰的實現也可以通過引用「thisth」來完成 - 你可能會將this引入一些空引用 - 所以它是UB。 – 2013-02-14 11:28:06

+1

我99%肯定「this」是歇斯底里的歷史原因。參考文獻在第一代C++中不可用,爲了保持兼容性,必須保持這種方式。 – 2013-02-14 11:46:57