c++高手,“浅拷贝”有点不懂,怎么内存地址还是不同(在线)

来源:百度知道 编辑:UC知道 时间:2024/05/25 12:44:57
书上讲“浅拷贝”时写道:

浅拷贝构造函数仅拷贝对象,而不拷贝对象资源。也就是说,浅拷贝的两个对象拥有同一个资源。

书上的意思是不是说两个对象指向同一个内存地址?可是写了一个程序发现不同啊:
地址分别是:001BF818和001BF808
#include "iostream"
using namespace std;
class test
{
int x;int y;
public:

test(int vx,int vy)
{
x=vx;
y=vy;
cout<<"creat "<<x<<" "<<y<<endl;
}
~test()
{
cout<<"delete "<<x<<" "<<y<<endl;
}

};
//main复制掉了
void main()
{
test a(4,8);
test b=a;
cout<<&a<<" "<<&b<<endl;
}

(一楼)不会吧,书上说:类中没有定义拷贝构造函数,那么编译器提供下一个默认拷贝构造函数,称为浅拷贝.

"(一楼)不会吧,书上说:类中没有定义拷贝构造函数,那么编译器提供下一个默认拷贝构造函数,称为浅拷贝."

——所以我们才要在需要的时候自定义复制构造函数:

#include <iostream>
using namespace std;

class a
{
int* p;
public:
a(int n):p(new int(n)){}
void print(){cout.setf(ios::showbase);cout << hex << this->p << endl;}
~a() {delete p;}
};

class b
{
int* p;
public:
b(int n):p(new int(n)){}
b(const b& _b):p(new int(*_b.p)){}
void print(){cout.setf(ios::showbase);cout << hex << this->p << endl;}
~b() {delete p;}
};

int main()
{
a aa(3);
a bb(aa); // 浅拷贝
aa.print();
bb.print();

b cc(3);
b dd(cc); // 深拷贝
cc.print();
dd.print();
}

这个是复制拷贝
test* a = new test(4,8);
test* b=a;
这2个才会是一样的

浅拷贝应是基本数据类型的简单复制。不适合于具有动态内存的情况,此时应定义拷贝构造函数,进行动态内存的申请及其内容的复制。
test a(4,8);
test b=a; <