mar*_*eek 1 c++ destructor copy-constructor operator-keyword
我有一个my的测试类来制作我自己的字符串函数.我有复制析构函数的问题.
我有2个字符串:s1和s2.我调用函数s3 = s1 + s2;
它首先调用operator +函数,当它完成时调用析构函数.因此,operator = function中的字符串对象为空.我怎样才能解决这个问题?
析构函数:
String::~String() {
if (this->str)
delete[] str;
str = NULL;
len = 0;
}
Run Code Online (Sandbox Code Playgroud)
复制构造函数:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
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;
}
Run Code Online (Sandbox Code Playgroud)
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;
}
Run Code Online (Sandbox Code Playgroud)
operator+ 不应该通过引用返回局部变量.
将返回类型更改operator+为String.即,签名:
String operator+( String const& lhs, String const& rhs )
Run Code Online (Sandbox Code Playgroud)
您可能还想为您的String类编写一个"移动构造函数" :String( String&& other )如果您在C++ 11中编写代码.
一个简单的移动构造函数:
String::String( String&& other ): len(other.len), str(other.str) {
other.len = 0;
other.str = nullptr;
}
Run Code Online (Sandbox Code Playgroud)
这不是必需的,因为您的operator+遗嘱的return语句中的副本可能会被编译器在非平凡优化级别下"省略",但仍然是良好的实践.