操作员超载疑问
Operator overload doubts
我试图编写一些运算符重载函数,尤其是将其与自定义类和std::ofstream
对象一起使用的<<
运算符,但我对在线找到的各种示例中使用的语法有点困惑。例如,让我们将operator<<
重载视为简单自定义类的非成员函数:
#include <fstream>
class Example {
public:
int first;
int second;
};
// I found this kind of operator on the Internet
std::ofstream& operator<< (std::ofstream& out, Example obj) {
out << obj.first << endl << obj.second;
return out;
}
int main() {
Example a={1,2};
std::ofstream out;
out.open("test");
out << a;
out.close();
}
我真的不明白为什么它应该返回std::ofstream&
才能正常工作。我尝试使用以下运算符
void operator<< (std::ofstream& out, Example obj) {
out << obj.first << endl << obj.second << endl;
}
它也奏效了。我的意思是,out << obj;
不能被解释为operator<< (out , obj);
吗?为什么它必须返回一些东西,因为我正在传递对std::ofstream
对象的引用?
当我尝试将operator=
重载编写为自定义类的成员函数时,也出现了同样的疑问,如下面的简单示例所示
class Custom{
public:
int up;
int down;
Custom& operator= (Custom a) {
up=a.up;
down=a.down;
return *this;
}
};
我为赋值运算符使用了复制交换习语,所以不要太介意运算符定义,这只是一个例子。再次,写作
Custom obj1, obj2;
obj1 = obj2;
既然我可以将obj1 = obj2;
解释为obj1.operator=(obj2)
,为什么返回类型Custom&
必需而不是void
?
如果你想能够operator<<
链接在一起,你必须使用返回类型(std::ostream&
比std::ofstream&
更好,所以你也可以用它来std::cout
和喜欢)。
out << a << b;
(out << a) << b;
^^^^^^^^^^
lhs has to be a stream
对于赋值运算符,原因本质上是相同的。C++语法允许您编写许多需要返回类型的表达式,例如:
Custom obj1, obj2, obj3;
(obj1 = obj2) + obj3 ... // assign obj2 to obj1 and work with that...
返回引用允许您链接运算符,例如
std::cout << e1 << e2;
返回引用而不是void
,可以写成
out << obj1 << obj2 << obj3;
对于operator=
,你可以写
obj1=obj2=obj3;
写类似cout << "First operand" << "Second operand"
的东西,因为第一个操作数返回对ostream
的引用,第二个操作数使用此引用。 operator=
的工作方式相同。你可以写a = b = c
,但你也可以把它放在if (a = b)
或while (a = b)
里面。这可以使您的代码更短,但有点危险。
- 二进制超载操作员=
- GLM超载操作员用于地图不起作用
- 使用超载操作员可以实现另一个操作员超载
- 超载操作员|用于固定尺寸的数组
- 超载<<操作员意外行为?
- 实施超载操作员的麻烦
- 如何超载操作员 如果调用对象不是类对象
- 如何使用向量将类对象存储在超载操作员中
- 在课堂上超载I/O操作员的奇怪行为
- 超载操作员 *
- 超载操作员&lt;&lt; - 必须是二进制操作员
- 超载操作员 仅适用于类的特定情况
- AT()和超载操作员[] C 之间的差异
- 为什么我不能超载 *操作员
- 多个操作数,用于超载 *操作员
- MINGW中的全局超载操作员新/删除
- 超载操作员问题C++
- C 超载操作员问题
- 当我使用STL集时,我应该超载==操作员吗?
- C 我应该超载操作员