c++ - 在初始化列表中使用 "this"指针是否安全?

标签 c++ initialization this

我有两个具有父子关系的类(Parent 类“has-a”Child 类)和 Child类有一个返回 Parent 的指针。在构造 child 时初始化父指针会很好,如下所示:

class Child;
class Parent;

class Child
{
public:
 Child (Parent* parent_ptr_) : parent_ptr(parent_ptr_) {};

private:
 Parent* parent_ptr;
};

class Parent
{
public:
    Parent() : child(this) {};

private:
    Child child;
}

现在,我知道人们建议不要在初始化列表中使用 thisC++ FAQ说我会收到编译器警告(顺便说一句,在 VS2010 上,我没有收到警告),但我真的更喜欢这样,然后在 Parent 的构造函数中调用一些 set 函数。我的问题是:

  • 在创建 Child 对象时,父 this 指针是否明确定义?
  • 如果是这样,为什么按上述方式使用它被认为是不好的做法?

谢谢,

博阿斯

编辑:感谢 Timbo,它确实是 duplicate (呵呵,我什至选择了相同的类名)。所以让我们获得一些附加值:引用怎么样?是否可以/安全地执行以下操作? :

class Child
{
public:
 Child (Parent& parnet_ptr_) : parent_ptr(parent_ptr_) {};

private:
 Parent* parent_ptr;
};

class Parent
{
public:
    Parent() : child(*this) {};

private:
    Child child;
}

最佳答案

是的。在初始化列表中使用 this 指针是安全的只要它不用于直接或间接访问未初始化的成员或虚函数,因为对象尚未完全建。 child 对象可以存储 Parentthis 指针以备后用!

关于c++ - 在初始化列表中使用 "this"指针是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5058349/

相关文章:

c++ - 不能使用该对象的r值初始化对非常量对象的引用

c++ - 我可以使用成员变量实例化成员类模板吗?

c++ - 在 for 循环中显示索引图像

Javascript 在分配给其他变量时丢失了上下文

javascript - 在 Meteor 中使用 Jquery $(this)

javascript - 如何确定函数是用 `.call` 还是 `.apply` 调用的?

c++ - 链接器如何知道外部函数的定义在哪里?

python - 将代码添加到 __init__.py

c++ - 在需要之前避免初始化成员

c++ - 指向 C 样式数组元素的指针的 const vector