在C++中有两种构造方式赋值初始化和列表初始化,两者底层实现方式不同
在代码中赋值
#include<iostream>
using namespace std;
class Animal
{
public:
Animal()
{
cout<<"call Animal()"<<endl;
}
Animal(string name):type(name)
{
cout<<"call Annimal(String type)"<<endl;
}
Animal(const Animal &a)
{
cout<<"call Annimal(const Animal &a)"<<endl;
}
Animal& operator=(const Animal &a)
{
cout<<"call operator=(const Animal &a)"<<endl;
return *this;
}
private:
string type;
};
class Dog
{
public:
Dog(Animal &animal)
{
dog=animal;
}
private:
Animal dog;
};
int main()
{
Animal A("dog");
cout<<"-----"<<endl;
Dog D(A);
}
其中构造方式如下:
class Dog
{
public:
Dog(Animal &animal)
{
dog=animal;
}
private:
Animal dog;
};
输出结果:
一共两步:
1.Animal dog;创建私有对象
2.dog=animal;完成赋值
初始化列表
构造方式如下:
class Dog
{
public:
Dog(Animal &animal):dog(animal){};
private:
Animal dog;
};
输出结果:
只有一步,用形参annimal来构造数据成员dog
结论
用初始化列表构造对象直接调用拷贝构造函数的形参来构造函数参数成员,而不用先构造后赋值
直接就调用拷贝构造函数用形参来构造数据成员
初始化列表构造对象效率更高