C++ 函数调用如何在构造函数';初始化器列表

C++ 函数调用如何在构造函数';初始化器列表,c++,initializer-list,C++,Initializer List,考虑以下程序 #include <iostream> using namespace std; class A { public: A() { cout << "A constructor\n"; } void f() { cout << "A used\n"; this->i++; } private: int i; }; class B { public: B(A &a

考虑以下程序

#include <iostream>

using namespace std;

class A
{
public:
    A() { cout << "A constructor\n"; }
    void f()
    {
       cout << "A used\n";
       this->i++;
    }
private:
    int i;
};

class B
{
public:
    B(A & a1)
    {
        cout << "B constructor\n";
        a1.f();
    }
};

class Z
{
public:
    Z() :  a_(), b_(a_) {}
private:
    B b_;
    A a_;
};

int main() {
    Z z;
    return 0;
}
我的问题,


由于数据成员对象是按照其在类中的声明顺序创建的,因此将首先创建
b
。但是,它如何能够调用尚未创建的数据成员
a_uquot
上的函数呢?编译器是否执行某种优化,将调用
f()
转换为普通函数调用?如果是,那么
这个->i++
是如何工作的?

当您明确指示编译器将引用传递到某个未初始化的对象时,编译器不会与您发生冲突。毕竟,您将其传递给的函数可能用于实际初始化对象


但是,访问未初始化的数据,例如,您的
this->i++,导致未定义的行为。

未定义的行为可能会发生。UB使任何事情都可能发生。然后,这意味着a_u和b_u的内存都是在调用其中任何一个的构造函数之前分配的,对吗?@pravar Yes。当一个对象的构造开始时,将为整个对象分配内存(当然,这不包括任何构造函数动态分配的内存)。
B constructor
A used
A constructor