当我说你不应该在构造函数中使用'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 ) )
// ^^^^
{
//...
}
};
这些例子正在运作,但是有可能存在未定义的行为吗?
答案 0 :(得分:9)
由于对象及其成员的内存是在构造函数调用之前分配的,因此this
指针本身的值不是问题:它是您可能取消引用的成员,可能是问题。
您的第一个代码片段有效,因为this->m_A
与m_A
相同,这是一个有效的表达式。
您的第二个代码片段可能会也可能不会,这取决于SecondClass
的构造函数的作用:
SecondClass
构造函数只是将指针存储到FirstClass
以供将来使用,那就没问题SecondClass
构造函数从传递给它的FirstClass
指针调用方法,则这不行,因为this
指针所指向的实例尚未初始化。 答案 1 :(得分:1)
首先,是的,使用'this'关键字是完全安全的, 如果所有那些成员都在堆栈上,'this'关键字将正常工作 那些是指针类型你必须首先为它们分配内存然后使用'this'关键字来使用它们。如果你不分配内存并尝试使用它们,那么它将产生一个问题。 其次,您询问了如何创建对象,以及何时创建类的成员,当您在main或任何函数中创建类的对象时,都会创建它们。