我正在尝试做一个类的深层副本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)
| 归档时间: |
|
| 查看次数: |
15909 次 |
| 最近记录: |