簡體   English   中英

復制構造函數調用析構函數C ++

[英]Copy constructor calls destructor c++

我有一個測試類來制作自己的字符串函數。 復制析構函數有問題。

我有2個字符串:s1和s2。 我稱函數s3 = s1 + s2;

它首先調用operator +函數,並在完成后調用析構函數。 因此,operator =函數中的字符串對象為空。 我怎樣才能解決這個問題?

析構函數:

String::~String() {
  if (this->str)
    delete[] str;
  str = NULL;
  len = 0;
}

復制構造函數:

String::String(const String& string) {
  this->len = string.len;
  if(string.str) {
    this->str = new char[string.len+1];
    strcpy(this->str,string.str);
  } else {
    this->str = 0;
  }
}

operator=

String & String::operator= (const String& string) {
  if(this == & string)
    return *this;

  delete [] str;

  this->len = string.len;

  if(string.str) {
    this->str = new char[this->len];
    strcpy(this->str,string.str);
  } else {
    this->str = 0;      
  }

  return *this;
}

operator+

String& operator+(const String& string1 ,const String& string2)
{
  String s;

  s.len = string1.len + string2.len;
  s.str = new char[string1.len + string2.len+1];
  strcpy(s.str,string1.str);
  strcat(s.str,string2.str);

  return  s;
}

operator+不應通過引用返回局部變量。

operator+的返回類型更改為String 即,進行簽名:

String operator+( String const& lhs, String const& rhs )

如果您正在用C ++ 11編寫代碼,則可能還想為String類編寫一個“移動構造函數”: String( String&& other )

一個簡單的move構造函數:

String::String( String&& other ): len(other.len), str(other.str) {
  other.len = 0;
  other.str = nullptr;
}

這不是必需的,因為在非平凡的優化級別下,您的operator+的return語句中的副本可能會被編譯器“消除”,但仍是一種很好的做法。

之所以調用Destructor是因為String s超出了您的operator +重載范圍。 您的operator +重載需要返回副本而不是引用。

因此,您應將operator +更改為

String operator+(const String& string1, const String& string2)

是的,我有你的問題

問題是,當您從+運算符函數返回對臨時對象的引用,然后將其分配給main中的其他對象時,這里=調用了重載函數,您正在向該對象傳遞對不再存在的對象的引用

因此,您可以從+運算符函數返回副本

要么

您可以在= overlaoded函數中傳遞副本

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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