我试图理解一个类的exectution的顺序,该类包含另一个类的嵌套对象。这是我的简单程序:
#include<iostream>
#include <string>
using namespace std;
class Alpha
{
int a;
public:
Alpha(int x)
{
a=x;
}
};
class Beta
{ int b;
public:
Beta(int y)
{
b=y;
}
};
class Gamma
{
Alpha A;
Beta B;
int c;
public:
Gamma(int a,int b, int d): A(a), B(b)
{
c=d;
}
};
void main()
{
Gamma g(5,6,7);
}
如您所见,Gamma有2个嵌套对象。现在当执行main()的第一行时,如何在类Gamma中开始执行?首先调用构造函数,或者首先创建对象/数据成员吗?
答案 0 :(得分:4)
构造函数执行顺序的问题很简单:首先,Gamma
构造函数启动,但随后它会立即开始初始化Alpha
和Beta
,如初始化列表中所指定。完成初个化程序列表后,将执行Gamma
构造函数的主体。
这有一个重要的转折:C ++将按照在类中声明它们的顺序初始化嵌套对象,而不是按照它们在初始化列表中列出的顺序。换句话说,即使您撤消Alpha
和Beta
,A(a)
也会在B(b)
之前初始化:
// The compiler will issue a warning for this
Gamma(int a,int b, int d): B(b), A(a)
{
c=d;
}
答案 1 :(得分:1)
首先调用构造函数,还是首先创建对象/数据成员?
从初始化列表中,成员或基类构造函数调用在包含/继承类的构造函数体之前执行。
您可以轻松查看在构造函数中放置一些输出语句的内容
Alpha(int x) {
cout << "a = " << a << std::endl;
a=x;
cout << "Alpha(" << a << ")" << std::endl;
}
Beta(int y) {
cout << "b = " << b << std::endl;
b=y;
cout << "Beta(" << b << ")" << std::endl;
}
Gamma(int a,int b, int d): A(a), B(b) {
cout << "c = " << c << std::endl;
c=d;
cout << "Gamma(" << c << ")" << std::endl;
}
输出
a = 0
Alpha(5)
b = 134514731
Beta(6)
c = -1218371596
Gamma(7)
请在此处查看fully working sample。
答案 2 :(得分:0)
首先初始化初始化列表中的对象。然后,执行{}
内的构造函数的主体。