为什么重载ostream的运算符<<需要引用“&”?

问题描述 投票:4回答:2

我一直在学习C ++。

From this page,我明白超载“<

ostream& operator<<(ostream& out, Objects& obj) {
    //
    return out;
} 
//Implementation

friend ostream& operator<<(ostream& out, Object& obj);
//In the corresponding header file

我的问题是......为什么这个功能在qazxsw poi和qazxsw poi结束时需要“和”?

至少我知道“&”习惯了......

  1. 取一个值的地址
  2. 声明对类型的引用

但是,我认为它们都不适用于上述的重载。我花了很多时间在Google上搜索和阅读教科书,但我找不到答案。

任何建议将被认真考虑。

c++ operator-overloading
2个回答
11
投票

为什么这个函数需要在流和对象的末尾“和”?

因为您通过引用传递它们。 你为什么要通过引用传递它们。防止复制。

ostream

可以复制Object(可能)。但如果复制起来很昂贵呢?因此最好通过引用传递它以防止不必要的副本。

ostream& operator<<(ostream& out, Objects const& obj) // ^^^^^ note the const // we don't need to modify // the obj while printing. obj类型。无法复制(禁用复制构造函数)。所以你需要通过引用传递。

我通常直接在类声明中声明流操作符:

out

0
投票

std::ostream

表示class X { std::string name; int age; void swap(X& other) noexcept { std::swap(name, other.name); std::swap(age, other.age); } friend std::ostream& operator<<(std::ostream& str, X const& data) { return str << data.name << "\n" << age << "\n"; } friend std::istream& operator>>(std::istream& str, X& data) { X alt; // Read into a temporary incase the read fails. // This makes sure the original is unchanged on a fail if (std::getline(str, alt.name) && str >> alt.age) { // The read worked. // Get rid of the trailing new line. // Then swap the alt into the real object. std::string ignore; std::getline(str, ignore); data.swap(alt); } return str; } }; 是一个带有void f(int& index) { index = 3; } 参数的函数,该参数通过引用传递。所以之后

f

int的价值为int a = 4; f(a); 。对于您提到的运算符,这意味着在执行运算符期间可能会更改a以及3(作为某种函数)。

© www.soinside.com 2019 - 2024. All rights reserved.