gpt4 book ai didi

c++ - 复制构造函数和赋值运算符的类值实现

转载 作者:行者123 更新时间:2023-11-28 01:14:06 26 4
gpt4 key购买 nike

几个月前我问了一个关于复制构造函数和赋值运算符的问题,但我并没有真正解决它,现在我又被同样的问题困住了。我必须实现一个包含指针的类的复制构造函数、赋值运算符和析构函数,并且实现必须是类值的,即不同的对象不能指向同一个变量。假设我有这段代码:

class A{};
class B{
A* item;
int c;
public:
B(const A& a, int c_): item(new A(a)), c(c_){};
B(const B& b) //copy constructor
B& operator=(const B & b); //assignment operator
~B(); //destructor
}

现在,在我的许多示例中,对这些元素进行编码的正确方法是:

// copy constructor
B::B(const B& b){
item = new A(*(b.item));
c=b.c;
}

这里是第一个问题,问题是为什么我需要创建一个新的A对象,而不是仅仅将b.item指向的值赋给(*this).item。上次我被告知分配或引用未初始化的指针可能会导致奇怪的行为。

// assignment operator

B::operator=(const B& b){
if(this != &b){
c=b.c;
delete item;
item = new A (*(b.item));
}
}

我可能理解复制构造函数需要 new 运算符,但我为什么要删除项目并重新分配另一个 A 对象,而不是仅仅复制 this->item 中 b.item 指向的值?每当代码使用赋值运算符时,A 内部的指针都会被初始化,因此不再存在为未初始化的指针赋值的问题,那么为什么要遵循此过程?

最佳答案

如果您有一个对象b1,并且您创建了一个拷贝b2,如下所示:

B b1;
B b2(b1);

那么你必须为 b2.item 创建一个新的 A 对象来引用,否则它们将引用同一个项目:因此你需要 new B 的复制构造函数中的 A

现在考虑在赋值下会发生什么:

B b1;
B b2;
b2=b1;

在这种情况下,默认的复制赋值运算符也会做错误的事情:它将 item 指针从 b1 复制到 b2 ,所以现在 b1b2 将指向同一个 A。因此,您需要编写一个复制赋值运算符。

由于每个 B 都拥有自己的 A,您有两种选择:根据您的示例拷贝销毁并重新创建 A 对象赋值运算符,或者直接给包装对象赋值:

B& B::operator=(B const& other){  // delete and recreate
if(&other!=this){
c=other.c;
delete item;
item=new A(*other.item);
}
return *this;
}

B& B::operator=(B const& other){ // assign the item
if(&other!=this){
c=other.c;
*item=*other.item;
}
return *this;
}

哪个最好取决于 A 的类型及其一般行为。例如如果 A 无法分配,那么您必须删除并重新创建,而如果它可以分配,那么您可能希望这样做。

关于c++ - 复制构造函数和赋值运算符的类值实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59271093/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com