簡體   English   中英

在構造函數和對象創建中'this'

[英]'this' in constructor and objects creation

當我說你不應該在構造函數中使用'this'關鍵字而其他人說完全相反時,我會讀一些文章....

現在我的主要問題是: 它是否安全,在構造函數中使用'this'是一個好習慣嗎?

這個問題導致其他人:

  • 如何創建對象?
  • 什么時候創建一個類的成員? 在調用構造函數之前?

以下是在Windows 7上使用VS2012的一些示例:

class FirstClass
{
    int m_A;
public:
    FirstClass( int a ) : m_A( a )
    {
        std::cout << this->m_A << std::endl;
        //           ^^^^
    }
};

並且:

class ThirdClass; // forward decl
class SecondClass
{
public:
    SecondClass( ThirdClass* iTC )
    {
        // ...
    }
};

class ThirdClass
{
    SecondClass* m_SC;
public:
    ThirdClass():
        m_SC( new SecondClass( this ) )
    //                         ^^^^
    {
        //...
    }
};

這些例子是有效的,但是有可能存在未定義的行為嗎?

由於對象及其成員的內存是在構造函數調用之前分配的,因此this指針本身的值不是問題:它可能是您可以解除引用的成員,這可能是一個問題。

您的第一個代碼片段是有效的,因為this->m_Am_A相同, m_A是一個有效的表達式。

您的第二個代碼片段可能是也可能不是,這取決於SecondClass的構造函數的作用:

  • 如果SecondClass構造函數只是將指針存儲到FirstClass以供將來使用,那SecondClass
  • 如果SecondClass構造函數調用傳遞給它的FirstClass指針的方法,那么這是不行的,因為this指針指向的實例尚未初始化。

首先,是的,使用'this'關鍵字是完全安全的。如果所有那些堆棧上的成員''this'關鍵字將正常工作,那些指針類型必須首先為它們分配內存然后使用它們'this'關鍵字。 如果你不分配內存並嘗試使用它們,那么它將產生一個問題。 其次,您詢問了如何創建對象以及何時創建類的成員,當您在main或任何函數中創建類的對象時,將創建它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM