1

我有一个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

我的代码是在做浅拷贝还是深拷贝?任何人都可以向我解释一般的复制构造函数吗?

4

6 回答 6

2

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

在Wikipedia或任何优秀的 C++ 书籍中都有很多关于复制构造函数的信息,您应该先阅读类似的内容,然后看看您是否还有其他具体问题。

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

于 2013-03-20T15:07:01.370 回答
1

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

一个整数,就像电话号码一样,总是被深度复制。

我当前的代码是在做浅拷贝还是深拷贝?

深的

任何人都可以向我解释一般的复制构造函数和复制构造函数吗?

编译器合成的复制构造函数只会逐个复制生成成员,即复制指针值,而不是复制其内容。编译器合成的复制构造函数总是很浅的。每当需要深度复制时,课程作者都必须编写它(就像您所做的那样)。

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

Directory (Directory const & b) 
                     ^^^^^^
于 2013-03-20T15:16:18.557 回答
0

那是深拷贝。您的 int 是按值复制的,而不是复制引用或指针。

于 2013-03-20T15:06:34.283 回答
0

这是一个深拷贝。整数总是被复制。

于 2013-03-20T15:06:44.547 回答
0

正如其他人所说,这是一个深拷贝。

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

那么让我们看看以下内容:

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

当我阅读上面的代码时,我希望它A->DoSomething()只会影响A. 同样与B->DoSomething().

但是,深层复制规则可能存在例外情况。也许数据很大,所以制作副本可能效率低下:

class LargeData {
    int* PointerToLargeArray;
}

在上述情况下,您可以通过复制指针而不是数据来实现复制构造函数:

LargeData(LargeData& b)
{
    PointerToLargeArray = b->PointerToLargeArray;
}
于 2013-03-20T15:18:29.507 回答
0
Name = new char [10];
Address = new char [30]; //Same here 
strcpy (Name, b.Name);
strcpy (Address, b.Address);

名称和地址将只有实际字符串的内存地址。因此,当我们复制“名称”/“地址”时,我们必须复制“名称”/“地址”指向的实际内容。如果我们只进行如下浅拷贝,

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

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

Telephone_Number = b.Telephone_Number;

'Telephone_Number' 持有实际值。所以浅拷贝足以复制值

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

Telephone_Number 将有一个整数值,浅拷贝将复制该整数值

所以复制构造函数是“完美”的,做一个深拷贝。

于 2015-04-22T12:07:08.943 回答