重载<<运算符时堆栈溢出

thi*_*nom 2 c++

#include<iostream>
using namespace std;

class aClass
{
public:
    char *message;

    aClass(const char *message);
    ~aClass(){delete[] message;}
};

aClass::aClass(const char* newmessage)
{
    message = new char[strlen(newmessage) +1];
    strcpy(message,newmessage);
}

const ostream& operator<<(const ostream& o, const aClass &a)
{
    o << a.message;
    return o;
}

int main()
{
    aClass b("Hello");
    cout << b;
}
Run Code Online (Sandbox Code Playgroud)

有人可以向我解释为什么上面的代码会产生无限循环吗?

GMa*_*ckG 11

因为你const不应该在哪里:

/////                     /////
const ostream& operator<<(const ostream& o, const aClass &a)
Run Code Online (Sandbox Code Playgroud)

输出流假设是非const的; 毕竟,输出数据正在发生变化.所以当你这样做时:

o << a.message;
Run Code Online (Sandbox Code Playgroud)

它不能使用正常的重载char*,因为那个操作在非const流上.相反,它会搜索适当的重载并找到你的,确定它可以构造一个aClassfrom a.message(因为你的构造函数不是explicit),这样做并调用它.这永远重复.

它应该写成:

ostream& operator<<(ostream& o, const aClass &a)
{
    o << a.message;
    return o;
}
Run Code Online (Sandbox Code Playgroud)