复制构造函数调用析构函数C++
问题描述:
我有我的测试类来做我自己的字符串函数。我有一个复制析构函数的问题。复制构造函数调用析构函数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)
你可能也需要写一个“移动的构造”为您String
类:String(String&& other)
,如果你正在写在C++ 11的代码。
一个简单的移动构造函数:
String::String(String&& other): len(other.len), str(other.str) {
other.len = 0;
other.str = nullptr;
}
这不是必须的,因为在return语句复制你的operator+
下不平凡的优化级别可能会被“省略的”你的编译器,但仍良好的做法。
答
它调用析构函数,因为String s
将超出您的运算符+超载范围。您的operator + overload需要返回一个副本而不是参考。
因此,你应该你的运营商+改为
String operator+(const String& string1, const String& string2)
答
是啊,我得到了你的问题
的事情是,当你从+运算符函数返回一个临时对象的引用,然后你要分配此到主体中的其他对象所以在这里=重载函数被调用到你正在传递一个对象的引用不再存在
因此,无论你是否可以从+运算符函数返回一个副本
或
你可以通过在overlaoded功能
由于它的工作的=副本:d我被困在这了一点。 – marktielbeek 2013-04-23 19:17:44