4

当有人说你不应该在构造函数中使用'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 ) )
    //                         ^^^^
    {
        //...
    }
};

这些例子有效,但是否有可能出现未定义的行为?

4

2 回答 2

9

由于对象及其成员的内存是在调用构造函数之前分配的,因此this指针本身的值不是问题:可能是您可能取消引用的成员可能是一个问题。

您的第一个代码片段是有效的,因为this->m_A与 相同m_A,这是一个有效的表达式。

您的第二个代码片段可能正常,也可能不正常,具体取决于构造函数的SecondClass作用:

  • 如果SecondClass构造函数只是存储指向以FirstClass供将来使用的指针,则可以
  • 如果SecondClass构造函数从指针调用方法FirstClass传递给它,这是不行的,因为this指针指向的实例还没有被初始化。
于 2013-07-04T12:42:43.147 回答
1

首先,是的,使用“this”关键字是完全安全的,如果堆栈中的所有成员,“this”关键字都可以正常工作,而那些指针类型的成员必须先为其分配内存,然后使用'这个'关键字。如果您不分配内存并尝试使用它们,则会产生问题。其次,您询问如何创建对象以及何时创建类的成员,当您在主函数或任何函数中创建类的对象时会创建它们。

于 2013-07-04T12:55:34.870 回答