gpt4 book ai didi

c++ - C++中初始化列表的顺序

转载 作者:行者123 更新时间:2023-11-30 04:50:03 27 4
gpt4 key购买 nike

我理解对于非静态成员变量,初始化列表中的求值顺序是根据类中声明的顺序。

考虑下面来自 isocpp 的例子

#include <iostream>

class Y {
public:
Y();
void f();
};

Y::Y() { std::cout << "Initializing Y\n"<<this<<"\n"; }

void Y::f() { std::cout << "Using Y\n"<<this<<"\n"; }

class X {
public:
X(Y& y);
};

X::X(Y& y) { y.f(); }

class Z {
public:
Z() throw();
protected:
X x_;
Y y_;
};

Z::Z() throw() : y_(), x_(y_) {}

int main()
{
Z z;
return 0;
}

由于 X 的构造函数需要 Y 的引用,因此我们必须先初始化 y_;这意味着 y_ 必须在 x_ 之前声明。

我预计上面的程序会出现段错误,但下面是我的 o/p。有人可以解释一下吗。

-bash-4.1$ ./a.out
Using Y
0x7fffffffe0c1
Initializing Y
0x7fffffffe0c1

最佳答案

I expected above program to give seg fault but below is my o/p.

理论上,您的代码会受到未定义行为的影响。

已为对象分配空间但尚未初始化。此类对象和指向此类对象的指针可以以有限的方式使用,但在此类对象上调用非静态成员函数会导致未定义的行为。

来自 https://timsong-cpp.github.io/cppwp/n3337/basic.life#5 :

The program has undefined behavior if:

(5.1) the object will be or was of a class type with a non-trivial destructor and the pointer is used as the operand of a delete-expression,

(5.2) the pointer is used to access a non-static data member or call a non-static member function of the object, or

您看不到任何不良行为的最可能原因是 Y 没有任何成员变量。如果将成员变量添加到 Y 并在 Y:f() 中使用它,您很可能会更容易地注意到问题。

关于c++ - C++中初始化列表的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55155364/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com