| 
 | 
 
 
 楼主 |
发表于 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();  |   
 
 
 
 |