这个复制构造函数是在做深层复制还是浅层复制

Is this copy constructor doing a deep copy or shallow copy?

本文关键字:复制 构造函数      更新时间:2023-10-16

我有一个名为Directory的类,它的某些成员后面跟着一个复制构造函数。

class  Directory{
private:
    char * Name;                
    int Telephone_Number;   
    char * Address;             
public:
    Directory (Directory & b)    
    {
        Name = new char [10];   //Just assume that the name will not be greater than                                    //10 characters
        Address = new char [30]; //Same here 
        strcpy (Name, b.Name);
        Telephone_Number = b.Telephone_Number;
        strcpy (Address, b.Address);
    }
};

我想知道我的复制构造函数是执行深度复制还是浅层复制。我知道这是在深度复制AddressName,因为正在为它们分配新的内存,但Telephone_Number呢?

我的代码是浅层复制还是深层复制?有人能向我解释一下复制构造函数吗?

Telephone_Number在类中被声明为int,并按值复制(没有引用或指针或任何东西(,因此此构造函数正在执行深度复制

维基百科上或任何一本好的C++书中都有很多关于复制构造函数的信息,你应该先读一些类似的东西,然后看看你是否还有其他具体的问题。

值得一读的是,在初始化和分配对象时,有一些重要的规则可以控制复制构造函数的使用方式,您应该理解这些规则。

显然,这是在深度复制地址和名称,因为正在为它们分配新的内存,但Telephone_Number呢?

int和电话号码一样,总是被深度复制。

我当前的代码是浅层复制还是深层复制?

深度

有人能向我解释一下一般的复制构造函数和专门的复制构造函数吗?

编译器合成的副本构造函数只会通过成员复制,即复制指针值,而不是其内容。编译器合成的复制构造函数总是肤浅的。每当需要深度复制时,类作者都必须写出来(就像你做的那样(。

此外,复制构造函数的签名应更正为通过const引用的原始对象(此处为b(,以防止其意外修改:

Directory (Directory const & b) 
                     ^^^^^^

这是一个深度复制。您的int是通过值复制的,而不是复制引用或指针。

它是一个深度复制。整数总是被复制的。

正如其他人所说,这是一个深度复制。

通常,当您使用复制构造函数时,其想法是获得深度复制。这意味着副本不与原件共享数据。

因此,让我们看看以下内容:

Directory B = new Directory(A);
A->DoSomething();
B->DoSomething();

当我阅读上面的代码时,我希望A->DoSomething()只影响A中的数据。CCD_ 10也是如此。

但是,深度复制规则也可能有例外。也许数据很大,所以复制可能效率低下:

class LargeData {
    int* PointerToLargeArray;
}

在上面的例子中,您可以通过复制指针而不是数据来实现复制构造函数:

LargeData(LargeData& b)
{
    PointerToLargeArray = b->PointerToLargeArray;
}
Name = new char [10];
Address = new char [30]; //Same here 
strcpy (Name, b.Name);
strcpy (Address, b.Address);

名称和地址将只具有实际的内存地址一串因此,当我们复制"名称"/"地址"时,我们必须复制由"名称"或"地址"指向的实际内容

b.Name = Name; 
b.Address = Address;

我们只是指向某人创建的数据,这些数据也可能被该人删除。如果有人删除了实际内容,我们将指向该内容,假设该内容可用。现在指针处于悬空状态(Pointing Nothing(。这就是我们使用复制构造函数的原因。

Telephone_Number = b.Telephone_Number;

"Telephone_Number"包含实际值。所以浅拷贝就足以拷贝的值

名称/地址将具有内存地址,浅拷贝将复制只是实际值的内存地址。

Telephone_Number将具有一个整数值,浅层副本将复制该整数值

因此,复制构造函数是"完美的"进行深度复制。