|
楼主 |
发表于 2021-7-10 12:19:42
|
显示全部楼层
已经解决了,下面是我的结论,看看有没有错的,当时的调用被我改了,所以哈哈哈哈
//副本构造器
//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(); |
|