【问题标题】:Working of nested class objects?嵌套类对象的工作?
【发布时间】:2014-07-21 00:31:52
【问题描述】:

我试图了解一个类的执行顺序,该类在其中嵌套了另一个类的对象。这是我的简单程序:

#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 类中开始执行?先调用构造函数还是先创建对象/数据成员?

【问题讨论】:

    标签: c++ oop object


    【解决方案1】:

    构造函数执行顺序的问题很简单:首先,Gamma 构造函数启动,然后它立即继续初始化 AlphaBeta,正如您的初始值列表中指定的那样。一旦初始化器列表完成,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;
    }
    

    【讨论】:

    • 但是每当遇到Alpha A;它不应该用于 A 的默认构造函数吗?这真的不存在..所以它应该在那里给出一个错误。按照这个逻辑:ideone.com/Q4QWvC
    • @user3693825 如果Alpha A; 是局部变量或静态变量的声明,则为真。但是,由于它是类的成员变量,因此不会发出错误,因为您的类提供了调用Alpha的构造函数的参数,作为其自己的构造函数的一部分。但是,如果您从构造函数中删除 A(a),那么您会看到默认构造函数不存在的错误。
    【解决方案2】:

    先调用构造函数还是先创建对象/数据成员?

    从初始化列表中,成员或基类构造函数调用在包含/继承类的构造函数主体之前执行。

    您可以轻松检查在构造函数中放置一些输出语句的情况

    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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多