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

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

复制构造函数的函数名为类的名字,无返回值,和构造函数的区别就在于形参的不同。复制构造函数的形参为同类类型的引用,并且通常限定为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( void const ;

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( void const
{
    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指向的是同一个内存空间,他们共享同样的数据。

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


你可能感兴趣的:(复制构造函数之浅复制与深复制)