2016-07-25 65 views
5

我一直在尋找在這同時使用this->functionname()classname::functionname()調用函數在同一個類中的一些示例代碼。什麼時候應該使用this-> functionname()通過classname :: functionname()來調用成員函數?

有實際上這兩種方法之間的差異?

此外,這些方法之間是否有區別,只是簡單地調用函數使用functionname()

謝謝。

+0

這個問題的答案是這種新文檔啄不錯的人選。 – Dialecticus

回答

4

如C++往常一樣,事情的比你想象的那麼簡單。

有三種方法可以調用成員函數。

  1. 只是調用該函數:foo();
  2. 電話與thisthis->foo();
  3. 使用類的名稱:classname::f();

號#1和#2是等價的,有些人喜歡#2,因爲更清楚的是,這是一個成員職能而不是全球職能(這些人是少數)。

是否#3從#1的不同之和#2取決於調用的功能是否是一個虛擬函數。如果它是非虛擬的,則沒有區別。如果它虛擬有一個更多的派生覆蓋這個函數,然後#1和#2將調用派生函數和#3將調用該類中存在的覆蓋(或者如果這個類中沒有覆蓋,最接近的超級類)。

上一段的例外情況是調用站點位於構造函數或析構函數中。在這種情況下,即使該函數是虛擬的,#1和#2的行爲將與#3相同(在此調用覆蓋或最接近的超類)。

此外,如果函數爲static,則#2無效,#1和#3在從類內部調用時等同,但在從類外部調用時需要#3。

我希望我沒有錯過任何東西:)

事情我錯過:主叫內如果函數是由一個全球性的隱藏

  • this可能需要重新申報功能。見@Dutow's answer
  • this在處理two phase lookup(涉及模板時)時很有用。感謝@Alejandro的評論。
  • 我猜測使用using可能會在水中拋出更多的泥土,但我現在無法考慮進行研究(注意空洞)。

事實上,正如人們所想象的那麼簡單......

+0

你也可以提出這樣的觀點:「this'也是正確的[兩階段查找]所必需的(http://blog.llvm.org/2009/12/dreaded-two-phase-name-lookup.html?m= 1)在某些情況下 – Alejandro

+0

@Alejandro,謝謝,我已經更新了我的答案。 – Motti

3

通常?他們是一樣的。但根據具體情況,它們可能意味着不同的事情。

例如,請考慮下面的極端的例子(不要在一個真正的項目做到這一點!):

void f() { std::cout << "f" << std::endl; } 

class Cl { 
public: 
    void f() { std::cout << "Cl::f" << std::endl; } 
    void g() { 
     struct Cl { 
      static void f() { std::cout << "inside Cl::f" << std::endl; } 
     }; 
     void f(); 

     f(); 
     Cl::f(); 
     this->f(); 
    } 
}; 

int main() 
{ 
    Cl a; 
    a.g(); 

    return 0; 

} 

在這方面,全球f陰影的成員方法f的聲明,導致程序輸出f而不是Cl::f

當地struct Cl也影響它自己的類型名稱,導致Cl::f()調用它的靜態f方法。

只有調用this->f()明確導致調用Cl::f

與類型名稱的變體,當你想使用繼承和壓倒一切的虛擬方法時要調用父類的方法也是常用的 - 但是這在技術上不是同一類。

+0

TIL,你可以在函數內部聲明一個函數(並且我認爲我的答案是詳盡的...) – Motti

+0

而且我還設法將'Cl :: f'! :) – Dutow

+0

你先生,是邪惡的!幹得好(我已經在我的引用你的答案)。 – Motti

1

我想在這種情況下使用它的一個原因。例如。

class A 
{ 
public: 
    void foo() { this->doFoo(); } //equivalent to just doFoo(); 
    void foo2() { Abstract::doFoo(); } 
private: 
    virtual void doFoo() { /* do stuff */ } 
}; 

在摘要中調用foo時,它會在最派生類中調用doFoo。當調用foo2時,即使它被覆蓋,它也會始終調用基本實現。

相關問題