我正在構建一個用於處理複數的C++程序。 我有問題,此代碼的行爲:指針或引用
Complex& Complex::operator=(const Complex& com)
{
Complex::re_=com.re_;
Complex::im_=com.im_;
return *this;
}
現在,這個函數的返回類型是複雜類型的參考。所以我不應該通過this
而不是*this
。
我正在構建一個用於處理複數的C++程序。 我有問題,此代碼的行爲:指針或引用
Complex& Complex::operator=(const Complex& com)
{
Complex::re_=com.re_;
Complex::im_=com.im_;
return *this;
}
現在,這個函數的返回類型是複雜類型的參考。所以我不應該通過this
而不是*this
。
this
指針是您的對象實例的地址。
使用星號來取消引用它。
與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++中的指針,所以你必須明確地取消對它的引用獲得(語法)的參考。
'this'是一個指針,因爲它可以是NULL。 (它不應該,但它可以。) – 2013-02-14 11:19:54
不,這個''不能是NULL,我是一個符合標準的方法。如果你調用一個空指針的方法,你會得到UB。所以這不是使這個指針成爲一個有效的理由。在引用空指針時不會崩潰的實現也可以通過引用「thisth」來完成 - 你可能會將this引入一些空引用 - 所以它是UB。 – 2013-02-14 11:28:06
我99%肯定「this」是歇斯底里的歷史原因。參考文獻在第一代C++中不可用,爲了保持兼容性,必須保持這種方式。 – 2013-02-14 11:46:57
爲什麼標記爲c? – banuj 2013-02-14 11:12:03
不,'this'是一個指向'Complex'實例的指針,需要引用'return'。 – hmjd 2013-02-14 11:12:26