簡體   English   中英

當類包含指向另一個對象的指針時,重載賦值運算符

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM