2013-06-03 26 views
0

Java有一個允許方法通過「this()」引用自行調用的構造。 這個公約的名字此刻就讓我感覺不到了。 編輯:被稱爲構造函數代理如下所示。只會在構造函數上工作,而不會像我誤認爲的一般方法。「this」是否也適用於函數指針?

C++與其所有的指示善良提供了一個參考本身,但不是具體是本身?

例如,我有一個函數有多個重載等。

void DoesSomething(){ 
    this->(default1, default2); 
} 

void DoesSomething(int myValue1){ 
    this->(myValue1, default2); 
} 

void DoesSomething(int myValue1, int myValue2){ 
    //Do stuff 
} 
+0

函數沒有隱式的「this」指針。所以不行。改用功能名稱。 – 2013-06-03 16:46:43

+1

我們可以說「無限遞歸」...... :) –

+0

像這樣的東西會與C++函數調用操作符衝突 - 'returntype operator()(parameters);' –

回答

2

你需要明確指定函數名稱:

void DoesSomething(){ 
    this->DoesSomething(default1, default2); 
} 

void DoesSomething(int myValue1){ 
    this->DoesSomething(myValue1, default2); 
} 

void DoesSomething(int myValue1, int myValue2){ 
    //Do stuff 
} 

有一個給定的名稱上下文的其他功能沒有隱性知識,像你描述。

請注意,在Java中,這隻適用於構造函數,並且被稱爲Constructor Chaining。它通常不處理這種方法。

C++ 11還增加了對這一概念的支持(與delegating constructors一樣),儘管語法與Java,C#和其他語言不同。

對於構造,在C++ 11,可以寫爲:需要進行修改以

SomeType() : SomeType(42) {} 

SomeType(int arg) 
{ 
    // ... 
+0

您可能會補充說,C++中的構造函數鏈使用了不同的語法(但其工作原理與Java中的基本相同)。 –

+0

這主要是我在這裏考慮的構造函數。看起來好像C++ 11 [這裏](https://en.wikipedia.org/wiki/C++11#Object_construction_improvement)說了一些關於委託和鏈接構造函數的內容。 –

+1

@JamesKanze新增此參考。 –

1

即代碼:

void DoesSomething(){ 
    this->DoesSomething(default1, default2); 
} 

void DoesSomething(int myValue1){ 
    this->DoesSomething(myValue1, default2); 
} 

void DoesSomething(int myValue1, int myValue2){ 
    //Do stuff 
} 

void DoesSomething(){ 
    DoesSomething(default1, default2); 
} 

void DoesSomething(int myValue1){ 
    DoesSomething(myValue1, default2); 
} 

void DoesSomething(int myValue1, int myValue2){ 
    //Do stuff 
} 

因爲'這'在代碼中並不需要明確說明。 C++中存在的東西叫做函數對象,如下所述:http://www.cprogramming.com/tutorial/functors-function-objects-in-c++.html

+0

我確實喜歡「Functor」的想法。可以稱爲代碼合併? –

+0

也許吧,但把它叫做「Functor」並不困惑,因爲那麼其他人都會知道你在說什麼。 – Useless

0

this指向成員函數被調用的對象。當功能需要返回對自身的引用時,我已經看到它經常被使用,例如,operator()=;當這個運營商超載時,你通常也會看到類似以下的內容來防止自我分配

foo& foo::operator=(const foo& rhs){ 
    if ( this != &rhs) { 
     //do something 
    } 
    return *this; 
} 

我認爲這會回答你的問題?

參考:http://msdn.microsoft.com/en-us/library/y0dddwwd.aspx

+0

異常安全的複製分配不需要自我引用檢查。 –

+0

好吧,我添加它來指出另一個「this」指針的用法。但除此之外,這是一個簡單的檢查,可以防止未來的頭痛。 – ash

+0

我最常看到'this'的地方是'return * this',並且用於從派生類模板訪問父類的成員:http://ideone.com/6sFNjb。如果我看到'if(this!=&rhs)'的複製賦值,我立即認爲該函數不是異常安全的。 (例如,您鏈接的樣本不是異常安全的) –

相關問題