另外重载的代码没有效果

code in addition overload having no effect

我正在阅读一本 C++ 的旧书,其中开发了一个 "rational numbers" class 来介绍运算符重载等概念。这里有一些示例代码来自这本书:

界面:

const Rational operator+(const Rational& Rhs) const;

实施:

const Rational Rational::operator+(const Rational& Rhs) const
{
    Rational Answer(*this);
    Answer += Rhs;
    return Answer;
}

复制构造函数做你想做的事,+= 运算符被正确重载。

我决定通过实现一个字符串 class 来练习一下,所以我采用了类似的方法。我的 += 重载工作正常,但 + 似乎最终没有效果。

接口:

const String operator+(const String&) const;

实施:

const String String::operator+(const String& Rhs) const
{
    String Answer (*this);
    Answer += Rhs;
    return Answer;
}

复制构造函数(有效)定义如下:

String::String(const String& str)
{
    unsigned _strlen = str.len() + 1;
    content = new char[_strlen];
    std::memcpy(content, str.content, _strlen);
    length = _strlen - 1;
    content[length] = '[=14=]';
}

+= 被以下重载:

const String& String::operator+=(const String& Rhs)
{
    unsigned _Addl = Rhs.len();
    unsigned newLen = _Addl + length;  //length is member variable -- current length of content

    content = (char*) realloc( content, newLen+1 );

    std::memcpy(content+length, Rhs.content, _Addl);
    content[newLen] = '[=15=]';

    return *this;
}

但是,虽然我可以获得 += 的正确输出,但 + 运算符实际上无法 return 一个连接的字符串。通过函数内部的调试输出,Answer 保存了正确的内容,但它 return 是原始字符串而不是连接后的字符串。我有一种感觉,这与 const 无处不在有关,但我试过没有它也没有好运。

测试代码:

(主要):

String s1 ("Hello");
String s2 (" World!");
String s3 = (s1+s2);       //prints "Hello" when s3 is output
cout << (s1+s2) << endl;   //prints "Hello"

const char 的字符串构造函数*

String::String(const char* str)
{
    unsigned _strlen = strlen(str) + 1;
    content = new char[_strlen];
    std::memcpy(content, str, _strlen);
    length = _strlen - 1;
    content[length] = '[=17=]';
}

你的 String::operator+=() 尽管你声称它已正确实施,但并未正确实施。

首先,realloc() returns NULL 如果它失败了,并且您的代码没有检查它。

其次,更重要的是,length 成员没有更新。由于您的代码调用 len() 成员函数来获取一个字符串的长度,并使用 length 成员来获取另一个字符串的长度,因此您的所有函数都需要确保这两个方法同步(即它们为 String 的给定实例给出一致的结果)。由于 length 未更新,因此您的代码无法确保这一点。

可能还有比使用 C 风格的内存分配更好的方法,但是(假设这是一个学习练习)我不会去管它。

您没有为您的 Rational class 提供相关代码,但是,如果它不起作用,您的代码可能会在各种构造函数和成员函数之间表现出类似的不一致。