好的,我们放轻松,一步一步分析。
头等舱
class myclass {
public :
int a;
myclass(){a=0; cout<<"first"<<endl;}
myclass(int i){a=i;cout<<"second"<<endl;}
~myclass(){cout<<a<<endl;}
};
这里我们定义了一个类myclass
,它有一个a
type的成员变量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