处理嵌套的类对象?

时间:2014-05-31 09:07:02

标签: c++ oop object

我试图理解一个类的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中开始执行?首先调用构造函数,或者首先创建对象/数据成员吗?

3 个答案:

答案 0 :(得分:4)

构造函数执行顺序的问题很简单:首先,Gamma构造函数启动,但随后它会立即开始初始化AlphaBeta,如初始化列表中所指定。完成初个化程序列表后,将执行Gamma构造函数的主体。

这有一个重要的转折:C ++将按照在类中声明它们的顺序初始化嵌套对象,而不是按照它们在初始化列表中列出的顺序。换句话说,即使您撤消AlphaBetaA(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)

首先初始化初始化列表中的对象。然后,执行{}内的构造函数的主体。