在 c++ 中,当我使用 operator = 时,会自动调用析构函数?

In c++, when I use operator = , destructor is automatically called?

提问人:sonagi 提问时间:4/10/2016 最后编辑:iammilindsonagi 更新时间:4/10/2016 访问量:85

问:

我做了一个练习,我习惯 将一个对象分配给另一个对象。 我是这样做的。class stroperator =

#include <string.h>

class Str{
private:
    char *str;
    int len;
    int num;  
public:
    Str(int leng);
    Str(char *neyong);
    ~Str();

    int length(void);
    char *contents(void);
    int compare(Str a);
    int compare(char *a);
    void operator=(char *a);
    void operator=(Str a);
};

Str::Str(char *neyong){
    len = strlen(neyong);
    str = new char[len + 1];
    strcpy(str, neyong);
}
Str::~Str(){
    delete[] str;
}
int Str::length(void){
    return len;
}
char* Str::contents(void){
    return str;
}
void Str::operator=(Str a){
    len = a.length();
    str = new char[len+1];
    strcpy(str, a.contents());
}

(为了便于阅读,我跳过了一些功能)

我执行它,就像下面的代码一样。

Str a("hahahaha"), b("hihihihihihi");

cout << a.contents() << endl;
cout << b.contents() << endl;

a = b;

cout << b.contents() << endl;
cout << a.contents() << endl;   

问题:当我赋值时,b 的析构函数是 自动调用。可能会擦除其所有内容,因此不会返回正确的值。a = bb.~Str()b.contents()

我该如何解决这个问题????

C++ 重载 析构函数 赋值运算符

评论

0赞 juanchopanza 4/10/2016
您还需要实现复制构造函数。在赋值运算符中创建副本,因为该参数是一个值。Str
1赞 Mike 4/10/2016
或者你可以通过引用来传递它void Str::operator=(const Str& a)
1赞 juanchopanza 4/10/2016
@Mike当然。有时按值传递(对于复制和交换)是有意义的,但在这种情况下则不然。但是需要复制构造函数。没有它(并且没有禁用复制),该类就是一个错误。
0赞 juanchopanza 4/10/2016
顺便说一句,赋值运算符存在内存泄漏。您还需要解决此问题。
0赞 Mike 4/10/2016
当然,复制构造函数是使类具有基本功能所必需的,我的意思是只是为了绕过错误。

答: 暂无答案