复制构造函数调用析构函数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+下不平凡的优化级别可能会被“省略的”你的编译器,但仍良好的做法。

+0

由于它的工作的=副本:d我被困在这了一点。 – marktielbeek 2013-04-23 19:17:44

它调用析构函数,因为String s将超出您的运算符+超载范围。您的operator + overload需要返回一个副本而不是参考。

因此,你应该你的运营商+改为

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

是啊,我得到了你的问题

的事情是,当你从+运算符函数返回一个临时对象的引用,然后你要分配此到主体中的其他对象所以在这里=重载函数被调用到你正在传递一个对象的引用不再存在

因此,无论你是否可以从+运算符函数返回一个副本

你可以通过在overlaoded功能