在类的初始化过程中,成员初始化表是一种更高效的方式,从下面例子可以看出以下两种初始化方法的效率区别
这个例子中 MemClass是BigClass成员类,MemClass中仅包含一个int成员,我们通过一个例子来看
1 类和成员类的构造函数之间的执行关系
2 成员初始化表的作用
BigClass的拷贝构造函数有两种定义
第一种:
BigClass(const MemClass& a):_a(a){}
第二种:
BigClass(const MemClass& a)
{
_a = a;
}
对于第一种 成员类不调用默认构造函数,直接调用拷贝构造函数
对于第二种 成员类首先调用默认构造函数,然后调用=操作符重载 来完成复制
下面的例子可以演示这个过程
BigClass big2(MemClass(1));
对于第一种 依次调用
MemClass构造函数 生成临时对象
MemClass拷贝构造函数 生成类成员对象
BigClass构造函数,生成BigClass
对于第二种 依次调用
MemClass构造函数 生成临时对象
MemClass默认构造函数(无参数),生成类成员对象
BigClass构造函数,生成BigClass
MemClass 赋值构造函数= 将类的成员对象赋值为临时对象
#include <iostream>
using namespace std;
class MemClass
{
private:
int num;
public:
MemClass()
{
cout<<"default Constructer of MemClass is called,Addr:"<<this<<" size:"<<sizeof(*this)<<endl;
}
MemClass(int n)
{
cout<<"Constructer of MemClass is called ADDR:"<<this<<" size:"<<sizeof(*this)<<endl;
num = n;
}
MemClass(const MemClass &a)
{
cout<<"copy construct of MemClass is called Addr:"<<this<<" size:"<<sizeof(*this)<<endl;
this->num = a.num;
}
MemClass& operator= (const MemClass& roe)
{
cout<<"operator= of MemClass is called Addr:"<<this<<" size:"<<sizeof(*this)<<endl;
if (this == &roe) return *this;
this->num = roe.num;
return *this;
}
~MemClass()
{
cout<<"MemClass is destructed Addr:"<<this<<" size:"<<sizeof(*this)<<endl;
}
};
class BigClass
{
private:
MemClass _a;
public:
BigClass()
{
cout<<"default Constructor of BigClass Addr:"<<this<<" size:"<<sizeof(*this)<<endl;
}
#ifdef CASE1
BigClass(const MemClass& a):_a(a)
{
cout<<"Constructor of BigClass Addr:"<<this<<" size:"<<sizeof(*this)<<endl;
}
#else
BigClass(const MemClass& a)
{
cout<<"Constructor of BigClass Addr:"<<this<<" size:"<<sizeof(*this)<<endl;
_a = a;
}
#endif
~BigClass(){cout<< "BigClass is destructed Addr:"<<this<<" size:"<<sizeof(*this)<<endl;}
};
int main()
{
BigClass big2(MemClass(1));
return 0;
}
结果