拷贝构造函数意义:复制已有对象,来构造新对象
收获:
1.用已有对象来初始化新对象,使用的是拷贝构造函数【类名(const 类名& 对象)】,而不是默认构造函数【类名()】。
2.默认拷贝构造函数(浅拷贝),是字节对字节的完全复制,连指针内容也一起复制,所以会造成两个对象内的指针(若有的话)对同一块内存都有管辖权,使得同块内存发生两次析构而出错。
3.深拷贝构造函数是对象对对象的复制,连同原对象管辖的内存数据也复制一份,所以新对象可以完全独立。
4.简单类型的赋值或者初始化(A a(1)),编译器默认生成的拷贝构造函数足够使用,当对象内部具有指针时,需要自己写拷贝构造函数。
5.“=”赋值时,调用浅拷贝构造函数,除非对“=”操作符重载;
6.拷贝构造函数调用情况:1值传递;2类型转换的中间变量;3函数返回;
7.总之,若要完全深拷贝,1需要自己写好拷贝构造函数,2且对“=”符号重载到新的拷贝构造函数。
不足:
1.尚未明白操作符重载方法。
#include<iostream>
using namespace std;
class CE
{
public:
int length;
int* list;
public:
CE(){length=0;list=nullptr;};
CE(int len,int* tsList)
{
length=len;
list=new int[length];
for(int i=0;i<length;i++){
list[i]=tsList[i];
};
//cout<<"constructed function"<<endl;
};
CE(const CE& old){
length=old.length;
list=new int[length];
for(int i=0;i<length;i++){
list[i]=old.list[i];
};
};
~CE(){delete[] list;list=nullptr;cout<<"析构结束"<<endl;};
};
//尝试默认拷贝构造函数是否是浅拷贝,方法为使用一个内部成员为指针的对象来初始化一个新对象,看新对象的指针内容是否与原对象相同,相同为浅拷贝
//写自己的拷贝构造函数,重新分配内存区域
int main()
{
int length=2;
int* ts=new int[length];
for(int i=0;i<2;i++){ts[i]=i+5;};
cout<<"以下是深拷贝版构造函数初始化的结果"<<endl;
CE ce(length, ts);
cout<<"ts:\t\t"<<ts<<endl;
cout<<"ce.list:\t"<<ce.list<<endl;
CE ce1=ce;
CE ce2;
ce2=ce;
cout<<"ce1.list:\t"<<ce1.list<<endl;
cout<<"ce2.list:\t"<<ce2.list<<endl;
cin.get();
return 0;
};
可以用ce1的list指针是否改变来看,是浅拷贝还是深拷贝