[英]overloading the assignment operator when the class contains pointer to another object
我有以下關於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
的所有權。 原因有兩個:
您在B
顯式創建A
對象,而不是A
派生類型
B
擁有的所有權a
:構造函數,析構函數和賦值。
如果你需要在某種多態性的A
(使用派生類型的A
),你可以使用帶有智能指針std::unique_ptr
。
您的第一種情況是類B
包含A a
。 您的第二種情況是,好像類B
包含std::unique_ptr<A> a
。 兩種情況都是正確的。 但是我認為第一個與當前整個代碼更加一致(並且效率更高)。
如果需要多態,則應將第二個與std :: unique_ptr一起使用 。 請注意,在第二種情況下,您可以替換
a = new A();
*a = *src.a;
通過
a = new A(*src.a);
如果復制構造函數與賦值運算符一致。
使用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();
}
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.