复制构造函数调用析构函数c ++

时间:2013-04-23 19:00:13

标签: c++ destructor operator-keyword copy-constructor

我有一个my的测试类来创建自己的字符串函数。我有复制析构函数的问题。

我有2个字符串:s1和s2。 我调用函数s3 = s1 + s2;

首先调用operator +函数,当它完成时调用析构函数。因此,operator = function中的字符串对象为空。我该如何解决这个问题?

析构函数:

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;
}

3 个答案:

答案 0 :(得分:7)

operator+不应该通过引用返回局部变量。

operator+的返回类型更改为String。即,签名:

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

如果您使用C ++ 11编写代码,您可能还想为String类编写一个“移动构造函数”:String( String&& other )

一个简单的移动构造函数:

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

这不是必需的,因为operator+的return语句中的副本可能会被编译器在非平凡优化级别下“省略”,但仍然是良好的做法。

答案 1 :(得分:3)

它正在调用析构函数,因为String s超出了运算符+重载范围。您的operator + overload需要返回副本而不是引用。

因此,您应该将运营商+更改为

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

答案 2 :(得分:0)

是的,我遇到了你的问题

当你从+运算符函数返回对临时对象的引用然后你将它分配给main中的其他对象时,就是这里=在这里调用了重载函数,你要向其传递一个对象的引用不再存在

因此,您可以从+运算符函数

返回副本

您可以在=重叠函数

中传递副本