运算符重载(“<<”):为什么“cout”无法正常工作?

时间:2015-07-29 06:48:52

标签: c++

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

计划1:

#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

1 个答案:

答案 0 :(得分:3)

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

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

并实施:

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

我无法理解为什么这段代码会被编译,因为operator<<应该始终更改对象。您的代码是未定义的行为,可能会导致细分错误。