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