在c ++中会发生什么,如果两个对象都重载运算符&lt; <! - ?一个<<乙 - >

时间:2012-12-10 21:41:52

标签: c++ operator-overloading

我在

中想到了
cout << "Hello world" 

cout对象有一个运算符重载,因此我们可以将strings传递给cout对象成员函数。

但是在一些示例代码中,我看到了一个在其中定义了运算符重载的类。

class GenericPlayer : public Hand
{
    ..
    friend ostream& operator <<(ostream& os, const GenericPlayer& aGenericPlayer);
    ..
};

...
cout << aGenericPlayer << endl;
...

即使不是,如果coutaGenericPlayer重载operator<<会怎样?

4 个答案:

答案 0 :(得分:8)

  

即使不是,如果cout和aGenericPlayer都重载运算符&lt;&lt; ?

std::coutstd::ostream个对象,因此任何std::ostream& operator<<(std::ostream, SomeType)都可以与std::cout一起使用。但重点是运算符的第二个参数是不同的,因此重载是不同的。第一个“字符串”就像是

std::ostream& operator<<(std::ostream&, const char*);

和第二个

std::ostream& operator <<(std::ostream& os, const GenericPlayer& aGenericPlayer); 

因此,它们是不同的运算符重载,并且没有歧义。

答案 1 :(得分:2)

首先,coutaGenericPlayer都不会超载 任何东西。它们是对象,重载基于类型 (即使你通常不会说类型X重载<<, 但是有一个<<的重载可能需要一个 输入X作为其第二个参数。)

其次,重载解析基于所有参数, 不只是一个。有二十种不同的东西 <<的{​​{1}}重载({1}的基类 std::istream)的类型,但没有(至少在标准中 library)将std::cout作为第二个参数。所以他们 如果第二个操作数不是GenericPlayer,则不能使用。 同样,除了你拥有的GenericPlayer之外,你还可以拥有operator<<( int, GenericPlayer const& );它会被称为 如果左侧有int型和右侧 输入GenericPlayer。 (我想不出任何这种情况 不会是运营商超载滥用,而是语言 当然允许它。)

答案 2 :(得分:1)

为了cout接受GenericPlayer对象,您必须重载operator<<operator<<也称为插入运算符。因此,如果您在上下文中使用它,则将自定义函数的输出插入cout。重载运算符返回对原始ostream对象的引用,这也意味着您可以组合插入。您必须重载插入运算符以识别左侧的ostream对象和右侧的GenericPlayer。另见Overloading the << Operator for Your Own Classes 。就cout而言,coutclass ostream的对象,表示标准输出流。它对应于cstdiostdout。因为cout是类ostream的对象,所以我们可以使用例如插入运算符(ostream :: operator&lt;&lt;)作为格式化数据或使用写成员函数作为无格式数据来编写字符。

答案 3 :(得分:1)

  

如果cout和aGenericPlayer都重载运算符&lt;&lt;

它们都没有超载它,它作为常规函数(不是成员)重载。请注意在您的示例中使用friend;这允许函数在不成为成员的情况下访问类的内部。因此,避免了这种情况。