将Object初始化为另一个类的成员

use*_*866 3 c++

我只是想了解它是如何发生的,因为它是c ++的新手.

让我详细说明我的问题陈述.

class test1 {
public:
    test1() {
        cout << " test1::constructor called" << endl;
    }
    ~test1() {
        cout << " test1::destrcutor called" << endl;
    }
};

class test2 {
public:
    test2() {
        cout << " test2::constructor called" << endl;
    }
    ~test2() {
        cout << " test2::destrcutor called" << endl;
    }
};

class derived :public test1, public test2 {
    test2 t2;
    test1 t1;
public:
    derived() {
        cout << " derived constructor called" << endl;
    }
    ~derived() {
        cout << "derived destructor called" << endl;
    }
};

int main() {
    derived d;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

上述程序的输出显示

   test1::constructor called
   test2::constructor called
   test2::constructor called
   test1::constructor called
   derived constructor called
   derived destructor called
   test1::destrcutor called
   test2::destrcutor called
   test2::destrcutor called
   test1::destrcutor called
Run Code Online (Sandbox Code Playgroud)

所以这里我的问题是在什么点上它称为派生类中成员变量的构造函数,因为我没有为它设置任何初始化程序.

mks*_*eve 8

建筑的顺序是基础,然后成员如此: -

test1::constructor called  << first base of 'derived'
test2::constructor called  << second base of 'derived'
test2::constructor called  << member of 'derived' t2
test1::constructor called  << member of 'derived' t1
derived constructor called << code in 'derived::derived'
derived destructor called  << code in 'derived::~derived'
test1::destrcutor called   << destruction of t1
test2::destrcutor called   << destruction of t2
test2::destrcutor called   << destruction of derived
test1::destrcutor called   << destruction of derived
Run Code Online (Sandbox Code Playgroud)

对象只有一个析构函数,它有一个定义的命令来销毁对象.这会破坏班级从头到尾的所有成员.

然后以"逆序"破坏阶级及其基础.

每个构造函数都可以选择要初始化的内容,但不能选择顺序.

a_class::a_class( params ) : 
           base_n( params ), base_n_1( params ), 
           member_1( params), member_2( params),...
Run Code Online (Sandbox Code Playgroud)

member initialization list允许给出不同的参数来构造所有的基础和对象,但不影响顺序.它始终是first_base,second_base,first_member,second_member,...

这种排序是为了确保它与析构函数相反.

这些规则允许我弄清楚哪些消息来自成员,哪些来自基地.

没有从member initialization listwill 初始化的成员仍然会调用其默认构造函数test2::test2.作为一个class/ struct有一个构造函数,它们只会通过调用构造函数来生成.

Plain-old-Data或者POD是简单类型,例如int没有构造函数的类型.它们未被初始化(无论在记忆中留下什么价值).