好的,我们放轻松,一步一步分析。
头等舱
class myclass {
public :
int a;
myclass(){a=0; cout<<"first"<<endl;}
myclass(int i){a=i;cout<<"second"<<endl;}
~myclass(){cout<<a<<endl;}
};
这里我们定义了一个类myclass,它有一个atype的成员变量int。它声明了一个默认构造函数(没有参数),它分配给a,0然后继续 print first。
我们还有一个单参数构造函数,它初始化a到第一个参数并打印second,以及一个析构函数,它在释放之前简单地打印成员变量 a 的值。
初始化列表
现在,在构造函数中,您可以定义表单上的初始化列表
<class name>(...) a(x), b(y), c(z), ... {}
// ^^^^^^^^^^^^^^^^^^^^^
当类的任何成员变量的类型没有可用的默认构造函数时,此初始化列表是必需的。假设我们创建一个nogood没有默认构造函数的类,并定义我们的主类有一个 type 的成员,nogood他将如何初始化该成员变量?您可以期望它等到构造函数主体被执行。
二等舱
class yourclass : protected myclass {
int x;
myclass m1;
public:
myclass m2;
yourclass (int i): m2(3),myclass(i){x=i; a=7;}
};
现在你的类继承protected自myclass. 这是什么意思?这意味着无论 inmyclass是公共的还是受保护的,都将受到保护yourclass(无论是私有的还是私有的)。
该类yourclass定义了两个私有成员x和m1一个公共成员m2。它没有为它定义任何默认构造函数,而是定义了一个参数构造函数(如果需要,它实际上也可以用于隐式转换为int)yourclass。
输出:构造函数
首先,它调用受保护的子对象的构造函数来生成second. 然后,由于我们没有m1显式初始化,它将使用默认构造函数对其进行初始化,生成输出first。最后在构造函数中,我们初始化m2(3)哪个类型myclass将调用myclass::myclass(int)生产second作为输出。所以输出是:
second
first
second
输出:析构函数
现在对于析构函数调用,它将以与初始化相反的顺序为每个成员变量调用析构函数。初始化的顺序是:m1, m2. 逆序为m2, m1。m2在3初始化列表中m1被初始化0,默认情况下被初始化为。然后最后它调用ob1初始化为的析构函数7。因此最终输出为:
second
first
second
3
0
7