在 c++ 中,如果两个对象都重载运算符<<,会发生什么?a<<b
In c++ what happens, if both objects overload operator<<? a<<b
我认为在
cout << "Hello world"
cout
对象有一个运算符重载,因此我们可以将strings
传递到cout
对象成员函数中。
但是在一些示例代码中,我看到了一个类,其中定义了运算符重载。
class GenericPlayer : public Hand
{
..
friend ostream& operator <<(ostream& os, const GenericPlayer& aGenericPlayer);
..
};
...
cout << aGenericPlayer << endl;
...
即使不是,如果cout
和aGenericPlayer
都过载怎么办 operator<<
?
即使不是,如果 cout 和 aGenericPlayer 都重载运算符怎么办<<?
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);
因此,它们是不同的运算符重载,没有歧义。
首先,cout
和aGenericPlayer
都不会重载什么。 它们是对象,重载基于类型(即使你通常不会说 X 型重载<<
,而是存在超载<<
可能需要键入 X 作为其第二个参数)。
其次,重载解决基于所有参数,不止一个。 大约有二十种不同的东西std::istream
的重载<<
(这是std::cout
的类型),但没有(至少在标准中是这样库)将GenericPlayer
作为第二个参数。 所以他们如果第二个操作数不是GenericPlayer
则无法使用。同样,你可以有一个 operator<<( int, GenericPlayer
const& )
,除了你拥有的那个;它将被称为如果左侧有类型 int
,而右侧键入 GenericPlayer
。 (我想不出任何这种情况不会是运算符重载滥用,而是语言当然允许。
为了让cout
接受GenericPlayer
对象,您必须重载operator<<
。 operator<<
也称为插入运算符。因此,如果您在上下文中考虑这一点,则将自定义函数的输出插入到cout
。重载运算符返回对原始 ostream 对象的引用,这也意味着您可以组合插入。必须重载插入运算符才能识别左侧的ostream
对象和右侧的GenericPlayer
对象。另请参阅重载您自己的类的 <<运算符 。就cout
而言,cout
是表示标准输出流的class ostream
对象。它对应于cstdio
流stdout
。因为cout
是类 ostream 的对象,我们可以将字符作为格式化数据写入其中,例如使用插入运算符 (ostream::operator<<) 或使用 write 成员函数作为无格式数据,等等
如果 cout 和 aGenericPlayer 都重载运算符怎么办<<
它们都没有重载它,它是作为常规函数(不是成员)重载的。请注意示例中friend
的使用;这允许函数访问类的内部结构,而无需成为成员。因此,可以避免这种情况。
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 警告处理为错误这里有什么问题
- 什么时候调用组成单元对象的析构函数
- #定义c-预处理器常量..我做错了什么
- 努力将整数转换为链表。不知道我在这里做错了什么
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 什么时候在C++中返回常量引用是个好主意
- 当在同一名称空间中有两个具有相同签名的函数时,会发生什么
- C++避免重复声明的语法是什么
- c++库的公共头文件中应该包含什么
- 问题:什么是QAbstractItemView::NoEditTriggers的反面
- 有什么方法可以遍历结构吗
- 当类在C++中定义时,有什么方法可以"register"类吗?
- ifstream什么都没读
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- 什么是模板&lt;&gt;inline bla bla
- &lt;&lt;&lt;的这些超载有什么区别操作员
- 这是做什么的?如果(无符号(dx) & lt;无符号(大小))
- 什么会导致死亡<<变量& lt; & lt;“ t";当输出超过终端宽度时,打印空白而不是值