[英]Extra destructor in Constructor, Copy constructor, Destructor sequence in 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.