C++之副本构造器
基类:class Obj
{
public:
Obj(int *p,string name);
~Obj();
//Obj operator =(const Obj& rhs);
void printObj();
int* ptr;
string name;
};
Obj::Obj(int *p,string n)
{
ptr = p;
name = n;
}
Obj::~Obj()
{
cout << "this name: " << name << endl; //打印obj名称
delete ptr;
}
void Obj::printObj()
{
cout <<name << ": "<< *this->ptr << endl;
}
运行之后:
delete这里报错,
为什么先delete obj 的名字为obj2,按道理先delete obj1的话,由于名字已经修改为obj1了,应该是this name: obj1的
第二次 delete ,结果是 this name : obj1 ,这是又是为什么 你是如何调用的?把调用代码发上来 已经解决了,下面是我的结论,看看有没有错的,当时的调用被我改了,所以哈哈哈哈
//副本构造器
//1.产生原因: 进行 = 类拷贝时,如果类中有指针,逐行拷贝会把指针指向同一个地址,
//留下隐患(用类2区修改类1指针的值)
//2.解决方法: 使用赋值操作符重载,修改指针拷贝方式
Obj obj1(new int(1),"obj1");
Obj obj2(new int(2),"obj2");
cout << "原本的" << endl;
obj1.printObj();
obj2.printObj();
//正常delete 情况是: 先obj2 后 obj1
//拷贝过后打印
cout << "把obj2 拷贝给obj1 之后" << endl;
//拷贝之后会调用obj1的析构函数,原因是,没有返回值没有引用,
//返回的对象作为临时对象重新拷贝给obj1,作为形参,调用的是默认拷贝函数,导致调用其析构函数,吧prt delete 就出现了乱码
//当形参为一个引用的时候,实参也对象,这时候系统会将形参指向实参,不是临时的,此时系统就不会对形参调用构造函数和析构函数!
obj1 = obj2;
obj1.printObj();
obj2.printObj();
cout << "把修改obj2的ptr 值,obj1.name修改值 之后" << endl;
//*obj2.ptr = 5; //修改其值: obj1不变,obj2为5
//obj1.name = "obj1"; //拷贝之后名字也变为obj2
obj1.printObj();
obj2.printObj();
//过后就在delete ptr时报错,
//原因:先delete obj2 ptr ,后delete obj ptr的地址指向obj2 已被清除 ptr ,地址为空,报错
//解决方法是:使用赋值运算符重载
//对象作为另个对象初始化
Obj obj3(new int(3),"obj3");
Obj obj4 = obj3; //先去重载,再去调用副本拷贝函数
Obj obj5(obj3); //先去重载,再去调用副本拷贝函数
obj3.printObj();
obj4.printObj();
obj5.printObj();
页:
[1]