这个复制构造函数是在做深层复制还是浅层复制
Is this copy constructor doing a deep copy or shallow copy?
我有一个名为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
呢?
我的代码是浅层复制还是深层复制?有人能向我解释一下复制构造函数吗?
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将具有一个整数值,浅层副本将复制该整数值
因此,复制构造函数是"完美的"进行深度复制。
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 当从函数参数中的临时值调用复制构造函数时
- 如果有一个模板构造函数只有一个泛型参数,为什么我必须有一个复制构造函数
- 为什么需要复制构造函数,在哪些情况下它们非常有用
- 使用仅使用一次的变量调用的复制构造函数.这可能是通过调用move构造函数进行编译器优化的情况吗
- 为什么类中的ostringstream类型的成员会导致";调用隐含删除复制构造函数";错误
- 复制构造函数、赋值运算符C++
- std::ofstream 作为类成员删除复制构造函数?
- 复制构造函数C++无法正确复制指针
- 关于复制构造函数的一个棘手问题
- 为什么调用复制构造函数而不是移动构造函数?
- 填充上编译器生成的复制构造函数之间的不一致
- C++ 对象指针数组的复制构造函数
- C++ 基本 CTOR 说明 - 为什么不调用赋值/复制构造函数
- 防止在复制构造函数中隐式调用基构造函数
- 为用户定义的类正确调用复制构造函数/赋值运算符
- 具有已删除移动和复制构造函数的类的就地构造
- 复制构造函数隐式转换问题
- 复制构造函数中的递归调用