运算符重载("<<"):为什么"cout"不能正常工作?

operator overloading("<<"):why the “cout” did not work properly?

本文关键字:lt 常工作 工作 重载 运算符 为什么 cout 不能      更新时间:2023-10-16

我最近正在学习操作符重载。我不知道为什么cout在参数列表中为ostream添加const关键字后没有输出。这是否与添加关键字有关?代码如下:

Program1:

#include<iostream>
#include<string>
using namespace std;
class Foo
{
private:
    string bar;
public:
    Foo(string str);
    friend  const ostream& operator<<(const ostream& o, const Foo& f);
};
Foo::Foo(string str)
{
    this->bar = str;
}
const ostream&  operator<<(const ostream& o, const Foo& f)
{
    o << f.bar;
    return o;
}
int main()
{
    Foo f("HelloWorld");
    cout << f;
}

:没有

Program2 :

#include<iostream>
#include<string>

using namespace std;
class Foo
{
private:
    string bar;
public:
    Foo(string str);
    friend  ostream& operator<<(ostream& o, const Foo& f);

};
Foo::Foo(string str)
{
    this->bar = str;
}
ostream&  operator<<(ostream& o, const Foo& f)
{
    o << f.bar;
    return o;
}
int main()
{
    Foo f("HelloWorld");
    cout << f;
}

: HelloWorld

问题由const引起。将友函数声明为非const:

friend ostream& operator<<(ostream& o, const Foo& f);

和实现:

ostream& operator<<(ostream& o, const Foo& f)
{
    o << f.bar;
    return o;
}

我不明白为什么这段代码编译,因为operator<<应该总是改变对象。您的代码是未定义行为,可能导致分段错误。