C++中用拷贝构造函数来进行实例拷贝时的操作
如下例子,我们在进行实例复制时,发现默认构造方法并没有被重复调用,事实上是调用了拷贝构造函数来进行实例的复制操作。
#include<stdlib.h>
#include<iostream>
#include<string>
using namespace std;
class Apple{
public:
Apple(string _name){
m_name=_name;
cout<<"Apple"<<endl;
}
void setColor(string _color){
m_color=_color;
}
private:
string m_name;
string m_color;
};
int main(void){
Apple a11("apple1");//复制实例的两种方式
Apple a22(a11); //1
Apple a33=a11; //2
system("pause");
return 0;
}
结果显示如下,构造函数只调用了一次。
Apple
请按任意键继续...
创建一个Array实体类的头文件
//本例用来解释拷贝构造函数的深拷贝和浅拷贝
class Array{
public:
Array(int _count);
Array(const Array &array);
~Array();
void setCount(int _count);
int getCount();
void printAddr();
void printArr();
private:
int m_Count;
int *m_pArr;
};
Array类
#include "Array.h"
#include <iostream>
using namespace std;
Array::Array(int _count){
m_Count=_count;
m_pArr=new int[m_Count];
for(int i=0;i<m_Count;i++){
m_pArr[i]=i;
}
cout<<"Array"<<endl;
}
Array::Array(const Array &array){ //拷贝构造函数,此处对指针类型直接赋了值
m_Count=array.m_Count;
m_pArr=array.m_pArr;//就是这里,想想会有什么问题吗?
cout<<"Array &"<<endl;
}
Array::~Array(){
delete []m_pArr;
m_pArr=NULL;
cout<<"~Array"<<endl;
}
void Array::setCount(int _count){
m_Count=_count;
}
int Array::getCount(){
return m_Count;
}
void Array::printAddr(){
cout<<"mAddr="<<m_pArr<<endl;
}
void Array::printArr(){
for(int i=0;i<m_Count;i++){
cout<<m_pArr[i]<<endl;
}
};
运行:
#include<stdlib.h>
#include<iostream>
#include<string>
#include "Array.h"
using namespace std;
int main(void){
Array arr1(5);
Array arr2(arr1);
cout<<arr1.getCount()<<endl;
cout<<arr2.getCount()<<endl;
arr1.printArr();
arr2.printArr();
Apple a1;
system("pause");
return 0;
}
运行时并没有出错,点击任意键退出的时候程序报错了,想想上面我们对指针进行的操作,指针直接赋值之后,析构函数在回收内存的时候就会出错,同一个地址回收的两次。
所以,我们要做的是要给指针类型的成员的拷贝构造的时候重新分配内存。
</pre>如下:<pre name="code" class="cpp">Array::Array(const Array &array){
m_Count=array.m_Count;
m_pArr=new int[m_Count];
for(int i=0;i<m_Count;i++){
m_pArr[i]=array.m_pArr[i];
}
cout<<"Array &"<<endl;
}