本文用于自己记录学习,由于初学C++,可能某些表述不正确,欢迎批评指正!
C++拷贝构造函数
当我们没有重写拷贝构造函数时,系统会自己默认生成一个拷贝构造函数,
什么时候会调用这个拷贝构造函数:
- 通过使用另一个同类型的对象来初始化新创建的对象。
- 复制对象把它作为参数传递给函数。
- 复制对象,并从函数返回这个对象。
我们可以自己重写一下这个拷贝构造函数
#include<iostream>
using namespace std;
class A{
public:
int length;
A(int len){
cout<<"调用有参构造函数"<<endl;
length=len;
}
//拷贝构造函数
A(const A &a){
cout<<"调用拷贝构造函数"<<endl;
//length=a.length;
}
};
class B:public A{
public:
int length;
B(int len):A(len){}
};
void print(A a){
cout<<"length="<<a.length<<endl;
}
int main(){
A a(10);//调用有参构造函数
cout<<a.length<<endl;
A a1=a;//调用拷贝构造函数
cout<<"a1.length="<<a1.length<<endl;
print(a);//调用拷贝构造函数
}
看看结果:
调用有参构造函数
10
调用拷贝构造函数
a1.length=-1
调用拷贝构造函数
length=0
可以看到当执行 A a1=a;或者 print(a);都会调用这个拷贝构造函数,
但是由于重写的拷贝构造函数没有实现复制,因此a1.length和打印出来的length都不是本来想复制过去的值
下面将入修改拷贝构造函数的实现代码:
#include<iostream>
using namespace std;
class A{
public:
int length;
A(int len){
cout<<"调用有参构造函数"<<endl;
length=len;
}
//拷贝构造函数
A(const A &a){
cout<<"调用拷贝构造函数"<<endl;
length=a.length;
}
};
class B:public A{
public:
int length;
B(int len):A(len){}
};
void print(A a){
cout<<"length="<<a.length<<endl;
}
int main(){
A a(10);//调用有参构造函数
cout<<a.length<<endl;
A a1=a;//调用拷贝构造函数
cout<<"a1.length="<<a1.length<<endl;
print(a);//调用拷贝构造函数
}
看看结果:
调用有参构造函数
10
调用拷贝构造函数
a1.length=10
调用拷贝构造函数
length=10
当实现拷贝函数的拷贝功能时就是正确的值了