我目前正在开发一个名为 Text 的 ADT,并且正在重载赋值运算符。当我像这样测试运算符时:assignText = alpha
一切输出正常。但是,当我执行 assignText = assignText
时,则会输出两个实心条。
assignText 被声明为一个文本对象。
我的重载赋值运算符如下:
void Text::operator= (const Text& other) {
bufferSize = other.getLength();
buffer = new char[bufferSize];
buffer = other.buffer;
}
其中 int bufferSize
和 char *buffer
如有任何提示或建议,我们将不胜感激。如果还需要什么,请告诉我。
最佳答案
其他答案已经指出了您的运营商实现的各种问题。在这里,我将尝试了解您正在发生的事情,即为什么代码的行为与您观察到的一样。如果 this == &other
,即在自赋值期间,您将当前长度作为新缓冲区的大小。该新缓冲区未初始化,因此此时它可能包含随机字节。在自赋值的情况下,最后一个赋值是空操作。总结一下:
void Text::operator= (const Text& other) {
bufferSize = other.getLength(); // Take length from current object
buffer = new char[bufferSize]; // Create new buffer, old buffer turns into a memory leak
buffer = other.buffer; // No-op as both are the same variable
}
所以这告诉你的是,你最终得到一个当前对象大小的缓冲区,但有未定义的内容。在您的情况下,未定义的内容恰好代表您提到的竖线。
要解决此问题,请确保根据其他答案和评论的建议修复赋值运算符。
关于C++赋值重载自赋值问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12334573/