我有一个名为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);
}
};
我想知道我的复制构造函数是执行深拷贝还是浅拷贝。我知道它是深度复制Address
和Name
,因为正在为它们分配新内存,但是Telephone_Number
呢?
我的代码是浅拷贝还是深拷贝?任何人都可以向我解释一般的复制构造函数吗?
答案 0 :(得分:2)
Telephone_Number
在类中声明为int
并按值复制(没有引用或指针或任何东西),因此此构造函数正在执行深层复制。 / p>
有关Wikipedia或任何优秀C ++书籍中的复制构造函数的大量信息,您应首先阅读类似的内容,然后查看是否还有其他具体问题。
可能值得阅读的时候,有一些重要的规则可以控制在初始化和分配你应该理解的对象时如何使用复制构造函数。
答案 1 :(得分:1)
显然它是深度复制地址和名称,因为正在为它们分配新的内存,但是关于Telephone_Number呢?
与电话号码一样,int总是被深层复制。
我当前的代码是浅拷贝还是深拷贝?
深
任何人都可以解释一般的复制构造函数并专门复制构造函数吗?
编译器合成的复制构造函数只会生成成员 成员副本,即复制指针值,而不是其内容。编译器合成的拷贝构造函数总是很浅。每当需要深层复制时,类作者必须编写它(就像你一样)。
此外,应修正复制构造函数的签名以通过
原始对象(此处为b
)的 const 引用,以防止意外修改:
Directory (Directory const & b)
^^^^^^
答案 2 :(得分:0)
这是一份很深的副本。 按值复制你的int,你不是要复制引用或指针。
答案 3 :(得分:0)
这是一份深层次的副本。始终复制整数。
答案 4 :(得分: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;
}
答案 5 :(得分: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将具有整数值,浅拷贝将被复制 整数值
因此复制构造函数是'PERFECT'进行深层复制。