键盘上的舞者

My Email: marckywu@gmail.com
随笔 - 19, 文章 - 0, 评论 - 3, 引用 - 0
数据加载中……

复制构造函数之浅复制与深复制

复制构造函数的函数名为类的名字,无返回值,和构造函数的区别就在于形参的不同。复制构造函数的形参为同类类型的引用,并且通常限定为const的引用,如Person类的复制构造函数的声明为:
Person(const Person &p); //copy-constructor

复制构造函数在执行对象的复制操作时,涉及到两种类型的复制——浅复制和深复制。浅复制就是将被复制对象的数据成员的值一一的复制给另一个对象,这里应该注意的是复制的是数据成员直接存储的值,而没有复制这个对象关联的一些其它资源。比如:对象有一个指针类型的数据成员,这个指针指向的是另外的一块内存空间,所以这个指针直接存储的值就是那块内存空间的地址,这个时候浅复制就只会复制指针存储的地址值,而不会复制内存空间存储的值。然而,深复制就要求复制相应的资源。
#include <iostream>

using namespace std;

struct Test {
    
//default-constructor
    Test()
        :pstr(
new string) { }
    
//copy-constructor
    #ifdef COPY
    Test(
const Test &nn);
    
#endif

    
void setVal(string ps);
    
void getVal(voidconst;

private:
    
string *pstr;
};

#ifdef COPY
Test::Test(
const Test &nn)
{
    
//new operate a new memory space
    pstr = new string(*(nn.pstr));
}
#endif

void Test::setVal(string ps)
{
    
*pstr = ps;
}

void Test::getVal(voidconst
{
    cout 
<< *pstr << endl;
}

int main(void)
{
    Test n1;

    n1.setVal(
"n1-set");
    cout 
<< "before creating n2, n1 ->";
    n1.getVal(); 

    Test n2 
= n1;
    n2.setVal(
"n2-set");

    cout 
<< "after creating n2, n1->";
    n1.getVal();
    cout 
<< "after creating n2, n2->";
    n2.getVal();

    
return 0;
}
    
上述程序在定义了COPY的时候运行结果为:
before creating n2, n1 ->n1-set
after creating n2, n1 ->n1-set
after creating n2, n2 ->n2-set
这种结果就是深复制导致的,n1,n2两个对象的数据成成员pstr指向了两个不同的内存空间。

没有定义COPY的时候运行结果为:
before creating n2, n1 ->n1-set
after creating n2, n1 ->n2-set
after creating n2, n2 ->n2-set
这种结果就是浅复制导致的,n1, n2两个对象的数据成员pstr指向的是同一个内存空间,他们共享同样的数据。

注意:应该避免浅复制,而应该使用深复制。有指针等数据成员的时候,考虑自定复制构造函数进行深复制都是必要的。


posted on 2009-07-13 01:56 Marcky 阅读(524) 评论(0)  编辑 收藏 引用 所属分类: C/C++


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理