1

我有一个名为 String 的简单类,它有一个 char* 作为私有字段。

class String {
      char *s;
+ some public methods
};

我想重载 + 运算符,因此 a + b 意味着 a 和 b 中的字符串被连接起来。

功能在这里:

String String::operator+(String a)
{
    String rez;
    rez.s = new char[strlen(this->s) + strlen(a.s) + 1];
    assert(rez.s);
    strcpy(rez.s, this->s);
    strcat(rez.s, a.s);
    cout<<rez.s<<endl; // HERE rez.s CONTAINS THE RIGHT STRING!
    return rez;
}

在我这样称呼之后: c = a + b;

我收到一个名为调试断言失败的错误。

有任何想法吗?

4

1 回答 1

1

首先,阅读三法则

然后,考虑一下:

class String {
      char *s;   // << pointer
+ some public methods
};

“+ 一些公共方法”最好有一个构造函数,将指针成员初始化为可测试的值(如 NULL),或者你很容易陷入未定义的行为。它更好地覆盖复制构造函数和赋值运算符,以正确地将字符串从一个 String 对象复制到另一个。最后,最好有一个析构函数,它知道如何清理指向在上述所有内容中分配的内容的动态指针。

强烈建议你前后阅读那篇文章。

于 2012-11-07T20:43:33.783 回答