我在
中想到了cout << "Hello world"
cout
对象有一个运算符重载,因此我们可以将strings
传递给cout
对象成员函数。
但是在一些示例代码中,我看到了一个在其中定义了运算符重载的类。
class GenericPlayer : public Hand
{
..
friend ostream& operator <<(ostream& os, const GenericPlayer& aGenericPlayer);
..
};
...
cout << aGenericPlayer << endl;
...
即使不是,如果cout
和aGenericPlayer
重载operator<<
会怎样?
答案 0 :(得分:8)
即使不是,如果cout和aGenericPlayer都重载运算符&lt;&lt; ?
std::cout
是std::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)
首先,cout
和aGenericPlayer
都不会超载
任何东西。它们是对象,重载基于类型
(即使你通常不会说类型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
而言,cout
是class ostream
的对象,表示标准输出流。它对应于cstdio
流stdout
。因为cout
是类ostream的对象,所以我们可以使用例如插入运算符(ostream :: operator&lt;&lt;)作为格式化数据或使用写成员函数作为无格式数据来编写字符。
答案 3 :(得分:1)
如果cout和aGenericPlayer都重载运算符&lt;&lt;
它们都没有超载它,它作为常规函数(不是成员)重载。请注意在您的示例中使用friend
;这允许函数在不成为成员的情况下访问类的内部。因此,避免了这种情况。