C++中this指針什麼情況下是必須要用的?

如題,最好能講下這種情況如果不加this會怎樣。謝謝!


  1. 重載(複合)賦值運算符通常返回 *this
  2. 把自己作為函數實參。如 auto child = new Node(this);中,構建函數的形參為父節點的指針。
  3. 在奇異遞歸模板模式(Curiously recurring template pattern)中,基類把自己向下轉型至派生類。


陳碩:類初始化時 this 指針何時生成,在構造函數中如何確保 this 指針有效?


當你在對象方法里需要明確使用自己的時候。

不加會怎樣?不加this你怎麼顯式地指代自己現在這個對象啊?


實現模板模式(Template Method Pattern)的時候,可以藉助於 template 來實現靜態的多態。請注意如下代碼中 Impl::Foo 中的 static_cast,以及 A、B 兩個派生類的 FooImpl。

template &
class Impl
{
public:
void Foo(void)
{
T *pT = static_cast&(this); // &<-- pT-&>FooImpl();
}
};

class A : public Impl&
{
public:
void FooImpl(void) { std::cout &<&< "Hello" &<&< std::endl; } }; class B : public Impl&
{
public:
void FooImpl(void) { std::cout &<&< "World" &<&< std::endl; } }; A a; a.Foo(); // Hello B b; b.Foo(); // World

這個技術名叫奇異遞歸模板模式(Curiously Recurring Template Pattern,感謝 @Milo Yip 指點),在 ATL 中被大量使用。


其實我覺得很多人類成員前面加個 m_ 或是後面加個下劃線,都不如直接寫 this。


額,想到一種情況。。。

你的member里有個變數叫nPapapaNum,你的member函數里也有個變數叫nPapapaNum,這時候你想把局部的nPapapaNum賦值給member的nPapapaNum就要這麼寫了。。。

this-&>nPapapaNum = nPapapaNum;


Capture the current object in lambda:

  1. [this](...){...} // stored reference of *this, c++11
  2. [that = *this](...)}{...} // capture by copy, c++14 required
  3. [*this](...){...} // capture by copy, c++17 required


我說一種情況,在const類成員函數中調用非const類成員函數時,直接調用肯定是不行的,可以先顯示把this轉為非const類指針。然後調用該函數


this這個關鍵字,表達的語義是什麼?

表達的是:在對象方法中,隱含的一個變數,表示該對象的指針。

什麼情況下必須使用?

  1. 需要明確這個語義、不用就會有混淆的情況下。比如對象方法中有個變數 test,而類也有個欄位命名為test,為了明確使用哪個 test ,需要加上 this。 如果不加,可能會出現編譯錯誤。
  2. 需要在對象方法中使用對象指針的時候。比如在對象方法中,需要以自身對象實例作為參數實例化一個類的時候。如果不用 this,實例化不了。


一直都在用,類函數沒出現this只是省略性寫法


你一個類繼承了一個類模板,想在子類中調用一個父類的成員函數,但是模板可能特化為沒有這個成員函數,你直接調用可能報錯。這時,用「this-&>成員函數名」來調用可指明你欽定是有這個成員函數的。也可以通過using來強制聲明


推薦閱讀:

TAG:C編程語言 | CC | 指針編程 | 指針CC |