如何在c ++中进行深层复制

cod*_*441 1 c++

我正在尝试做一个类的深层副本B,但A没有设置.

为什么b3->print返回垃圾编号而不是1

据我所知,b2和b3都指向同一个A对象.但是我用B的拷贝构造函数在堆上创建了一个新对象.那么他们为什么还在同一个对象上?

我希望这是有道理的.

#include <cstdlib>
#include <iostream>

using namespace std;

class A{
      int num;
public:
       A(int n):num(n){ cout<< "A "<< num << " constructor" <<endl;}  
       ~A(){ cout<< "A "<< num <<" destructor. " <<endl; }   

       int print(){
        cout<< num<< endl;
       }
};

class B{
      A *a;
      int num;
public:
       B(int n):num(n){
           a = new A(n);
           cout<< "B "<< num <<" constructor" <<endl;    
       }  
       ~B(){
            delete a; 
            cout<< "B "<< num <<" destructor"<<endl; 
       }    
       // Copy contructor
       B(const B & b): a(new A(b.num)){ 
       } 

       <strike>int<\strike> void print(){
        cout<< num << endl;
       }

       int get_num(){
           return num;
       }
};

int main(int argc, char *argv[])
{ 
    B *b2 = new B(1);
    B *b3(b2);
    b2->print();
    delete b2;
    b3->print();
    system("PAUSE");
    return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)

Luc*_*ore 11

B *b3(b2); 不做你的想法.

它相当于B* b3 = b2.指针将指向相同的位置.当你这样做时delete b2;,你也可以释放指向的内存b3.

要进行深层复制,请执行以下操作:

 B* b3 = new B(*b2);
Run Code Online (Sandbox Code Playgroud)

这里还有未定义的行为:

int print(){
   cout<< num << endl;
}
Run Code Online (Sandbox Code Playgroud)

因为你永远不会回来 将返回类型更改为void.

为了获得预期的价值:

B(const B & b): a(new A(b.num)), num(b.num){ 
} 
Run Code Online (Sandbox Code Playgroud)