当前位置: 首页 > 知识库问答 >
问题:

为什么在返回ostream类时使用引用?

吴哲
2023-03-14

完整代码如下所示:

#include<iostream>
#include<vector>
#include<string>
using namespace std;

class Point {
double x;
double y;
public:
Point();
Point(int x, int y);
void setPoint(int x, int y);
int getX(void)const;
int getY(void)const;
Point operator + (const Point & point);
Point& operator=(const Point& point);
};

ostream& operator<<(ostream& os, const Point& point) {
 os << point.getX() << " ," << point.getY();                    
 return os;
}

Point::Point() {
x = y = 0;
}
Point::Point(int x, int y) {
this->x = x;
this->y = y;
}
void Point::setPoint(int x, int y) {
this->x = x;
this->y = y;
}
int Point::getX(void)const {
return this->x;
}
int Point::getY(void)const {
return this->y;
}
Point Point::operator+(const Point& point) {
Point result(this->x + point.getX(), this->y + point.getY());
return result;
} 
Point& Point::operator=(const Point& point) {
this->x = point.getX();
this->y = point.getY();
return (*this);
}
int main() {
Point a(1, 2);
cout << a << endl;
}

在以下部分中

ostream& operator<<(ostream& os, const Point& point) {
 os << point.getX() << " ," << point.getY();    
 return os;         
}

如果返回类型为ostream,则会显示一条红线。我不确定返回类型与ostream有什么区别

*作为参考,我忘了返回操作系统,所以我编辑了这篇文章

共有2个答案

何博涛
2023-03-14

无法复制ostream对象,因为删除了ostream对象的复制构造函数。这就是为什么需要通过引用传递ostream对象。

专业提示:有没有想过为什么我们需要返回ostream

白光耀
2023-03-14

如果您要返回ostream,那么您将具有切片。如果传递的osofstream,那么返回的ostream将只是ofstreamostream部分,而不是完整的ofstream。通过引用返回时,您没有切片并且不会丢失有关流的完整类型的信息。

 类似资料:
  • 考虑以下行: 这不应该编译,因为< code>std::stringstream::运算符 似乎主要编译器现在接受了过去没有接受的这段代码。我想了解发生了什么标准更改来编译它? 我用gcc、clang和msvc做了一些测试,我可以找到发生变化的版本: 你可以在这里找到测试

  • 问题内容: 我们正在开发对延迟敏感的应用程序,并且已经对各种方法(使用jmh)进行了微基准测试。在对基准测试方法进行微基准测试并对结果满意之后,我实现了最终版本,但发现最终版本比我基准测试的 速度慢 了 3倍 。 罪魁祸首是所实现的方法正在返回一个对象而不是一个对象。这是基准代码的简化版本: 以上基准测试结果: 只需更改函数的返回类型,就可以将性能提高近三倍。 我认为返回枚举对象与整数之间的唯一区

  • 有人能给我解释一下这里发生了什么吗?

  • 问题内容: 使用的方法引用具有返回类型。但是在下面的示例中,允许不兼容。 如何解决方法声明以确保方法引用类型安全而无需手动强制转换? 用例:类型安全但通用的Builder。 我尝试实现没有注释处理(自动值)或编译器插件(lombok)的通用生成器 问题答案: 在第一个例子,并帮助解决通用参数,并以和分别。 除非您明确声明,否则它并不总是a ,这将导致编译时错误,如第二个示例所示。

  • 问题内容: 如果我有包含10个元素的列表: 为什么l [10]返回IndexError,而l [-1]返回0? 如果列表中没有以前的元素,我想做的就是抛出一个错误。 问题答案: 在Python中,负列表索引表示从列表右边开始计数的项(即的简写形式)。 如果发现需要负索引来指示错误,那么您可以简单地检查这种情况并亲自引发异常(或在那里进行处理):

  • 我有以下配置。 如果我添加另一个