gpt4 book ai didi

c++ - 当类包含指向另一个对象的指针时重载赋值运算符

转载 作者:行者123 更新时间:2023-11-30 03:36:45 25 4
gpt4 key购买 nike

我有以下 A 类代码

class A
{

int *ptr;

public:
A();
A(const A &);
~A();
A& operator = (const A &);
void display();
};

void A::display()
{

cout<<" ptr ="<<*ptr<<endl;
}

A::A()
{
cout<<"A's constructor called"<<endl;
ptr = new int;
*ptr = 100;
}

A::A(const A &src)
{
cout<<"copy constructor called"<<endl;
ptr = new int;
*ptr = *src.ptr;
}

A::~A()
{
delete ptr;
cout<<" destructor called"<<endl;
}

A& A::operator = (const A &src)
{
cout<<"A::assignmnet operator called"<<endl;
if(&src != this)
{

delete ptr ;
ptr = new int;
*ptr = *src.ptr;

}

return *this;

}

现在有另一个类 B,它包含一个指向类 A 的指针作为成员变量

class B
{
A *a;
public:
B()
{
cout<<" B's constructor called"<<endl;
a = new A();
}

B& operator = (const B &);
~B()
{
cout<<"B:destructor called"<<endl;
delete a;
}

void display()
{
cout<<"inside B's display"<<endl;
a->display();
}

};

现在 B 类的赋值运算符可以写成1.

B& B::operator=( const B & src)
{

cout<<"B's assignment operator called"<<endl;
if(this != &src)
{
*a = *src.a;
}

return *this;

}

或者作为2.

 B& B::operator=( const B & src)
{

cout<<"B's assignment operator called"<<endl;
if(this != &src)
{

delete a;
a = new A();
*a = *src.a;
}

return *this;

}

这两种情况是否正确。

最佳答案

在您显示的代码中,a不应是指针,而应简单地声明为 A a; .

来自您的代码 B拥有 A 的所有权.原因有两个:

  • 您显式创建了 A B 中的对象而不是 A 的派生类型

  • B拥有 a 的所有权: 构造函数、析构函数和赋值。

如果你需要在 A 上使用某种多态性(使用 A 的派生类型),您可以将智能指针与 std::unique_ptr 一起使用.

你的第一个场景的原因就好像类 B包含 A a .你的第二个场景的原因就好像类 B包含 std::unique_ptr<A> a .这两种情况都是正确的。但我认为第一个更一致(也更有效)w.r.t.当前的整个代码。

如果你需要多态性,你应该使用第二个 std::unique_ptr .请注意,在第二种情况下,您可以替换

a = new A();
*a = *src.a;

a = new A(*src.a);

如果复制构造函数与 w.r.t. 一致赋值运算符。

A a代码将是

class B
{
A a;
public:
B() {} // calls A()
B& operator = (const B & src) // or = default;
{ a = src.a; // this != &src is managed inside a
return *this;
}
~B() {} // no more usefull
void display()
{
cout<<"inside B's display"<<endl;
a.display();
}
};

unique_ptr代码将是

class B
{
std::unique_ptr<A> a;
public:
B() : a(new A()) {}
B& operator = (const B & src)
{ if (this != &src)
a.reset(src.a.get() ? new A(*src.a) : nullptr);
return *this;
}
~B() {} // no more usefull
void display()
{
cout<<"inside B's display"<<endl;
a->display();
}
};

关于c++ - 当类包含指向另一个对象的指针时重载赋值运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40545513/

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