拷贝构造函数是一类特殊的构造函数,它由编译器调用来完成一些基于同一类的其他对象的创建及初始化。我们先用一个简单例子来说明。
#include<iostream>
using namespace std;
class A{
public:
A(){
cout<<"无参构造函数"<<endl;
a=0;
}
A(int b){
cout<<"有参构造函数"<<endl;
a=b;
}
int a;
};
int main(){
A a(10);
A b=a;
cout<<b.a<<endl;
}
这段代码的输出结果为:
有参构造函数
10
可见A b=a将a的值赋值给了b,这个过程中其实调用的是系统默认的拷贝构造函数。当一个已初始化过了的自定义类类型对象去初始化另一个新构造的对象的时候,拷贝构造函数就会被自动调用。也就是说,当类的对象需要拷贝时,拷贝构造函数将会被调用。一下几种情况都会调用拷贝构造函数:
1.一个对象以值传递的方式传入函数体
2.一个对象以值传递的方式从函数返回
3.一个对象需要通过另外一个对象进行初始化
如果在类中没有显式地声明一个拷贝构造函数,那么,编译器将会自动生成一个默认的拷贝构造函数,该构造函数完成对象之间的位拷贝。我们再来看下面这个例子:
#include<iostream>
using namespace std;
class A{
public:
A(){
cout<<"无参构造函数"<<endl;
a=0;
}
A(int b){
cout<<"有参构造函数"<<endl;
a=b;
}
//添加上这一句
A(const A& b){
cout<<"拷贝构造函数"<<endl;
a=b.a;
}
int a;
};
int main(){
A a(10);
A b=a;
cout<<b.a<<endl;
}
这个例子的输出结果为:
有参构造函数
拷贝构造函数
10
因为我们加上了显示的拷贝构造函数。
#include<iostream>
using namespace std;
class A{
public:
A(){
cout<<"无参构造函数"<<endl;
a=0;
}
A(int b){
cout<<"有参构造函数"<<endl;
a=b;
}
//添加上这一句
A(const A& b){
cout<<"拷贝构造函数"<<endl;
a=b.a;
}
int a;
};
int main(){
A a(10);
A b=A(2);
b=2;
cout<<b.a<<endl;
}
这段代码的输出为:
有参构造函数
有参构造函数
有参构造函数
2
对于A b=A(2)因为无名对象是不调用拷贝构造函数的,b=2将2作为参数传给有参构造函数。