我一直在尋找在這同時使用this->functionname()
和classname::functionname()
調用函數在同一個類中的一些示例代碼。什麼時候應該使用this-> functionname()通過classname :: functionname()來調用成員函數?
有實際上這兩種方法之間的差異?
此外,這些方法之間是否有區別,只是簡單地調用函數使用functionname()
?
謝謝。
我一直在尋找在這同時使用this->functionname()
和classname::functionname()
調用函數在同一個類中的一些示例代碼。什麼時候應該使用this-> functionname()通過classname :: functionname()來調用成員函數?
有實際上這兩種方法之間的差異?
此外,這些方法之間是否有區別,只是簡單地調用函數使用functionname()
?
謝謝。
如C++往常一樣,事情的比你想象的那麼簡單。
有三種方法可以調用成員函數。
foo();
this
:this->foo();
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
可能會在水中拋出更多的泥土,但我現在無法考慮進行研究(注意空洞)。事實上,正如人們所想象的那麼簡單......
通常?他們是一樣的。但根據具體情況,它們可能意味着不同的事情。
例如,請考慮下面的極端的例子(不要在一個真正的項目做到這一點!):
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
。
與類型名稱的變體,當你想使用繼承和壓倒一切的虛擬方法時要調用父類的方法也是常用的 - 但是這在技術上不是同一類。
我想在這種情況下使用它的一個原因。例如。
class A
{
public:
void foo() { this->doFoo(); } //equivalent to just doFoo();
void foo2() { Abstract::doFoo(); }
private:
virtual void doFoo() { /* do stuff */ }
};
在摘要中調用foo
時,它會在最派生類中調用doFoo
。當調用foo2
時,即使它被覆蓋,它也會始終調用基本實現。
這個問題的答案是這種新文檔啄不錯的人選。 – Dialecticus