对于C++来说,拷贝构造函数是非常重要的,但我们知道,编译器自己定义的不过是浅拷贝的拷贝构造函数,所谓浅拷贝,就是直接把这个变量的值赋给别的变量。具体看如下代码
#include<iostream>
using namespace std;
struct Date{
int year;
int month;
int day;
};
class My
{
public:
My(int a,int b):temp1(a),temp2(b){}
My(My & my)
{
temp1=my.temp1;
temp2=my.temp2;
}
int getTemp1()
{
return temp1;
}
int getTeme2()
{
return temp2;
}
private:
int temp1;
int temp2;
};
int main()
{
My my1(3,4);
My my2(my1);
cout<<"my1"<<" "<<my1.getTemp1()<<" "<<my1.getTeme2()<<endl;
cout<<"my2"<<" "<<my2.getTemp1()<<" "<<my2.getTeme2()<<endl;
return 0;
}
上文My(My & my){}就是拷贝构造函数实现的过程。这样看起来没有什么问题,那么问题来了,如果我成员变量中有一指针呢?如果执行浅拷贝,那不就是只是简单的把地址赋值给了另一个指针,也就是说,有两个指针指向该空间。这样很不好。因为我原来想每个对象都有自己的堆空间,而不是与别人共同指向同一块空间,最重要的是,这样析构函数调用delete不是就要两次了。所以不能这样,那该怎么办呢?
这昂:
#include
using namespace std;
struct Date{
int year;
int month;
int day;
Date(int a,int b,int c):year(a),month(b),day©
{}
};
class My
{
public:
My(int a,int b):temp1(a),temp2(b)
{
date=new Date(1 ,2, 3);
}
My(My & my)
{
temp1=my.temp1;
temp2=my.temp2;
*date=*my.date;
}
int getTemp1()
{
return temp1;
}
int getTeme2()
{
return temp2;
}
private:
int temp1;
int temp2;
Date * date;
};
int main()
{
My my1(3,4);
My my2(my1);
cout<<“my1”<<" “<<my1.getTemp1()<<” “<<my1.getTeme2()<<endl;
cout<<“my2”<<” “<<my2.getTemp1()<<” "<<my2.getTeme2()<<endl;
return 0;
}
609

被折叠的 条评论
为什么被折叠?



