我一直在学习C++。
From this page,我知道可以用这种方式重载ostream的“<
ostream& operator<<(ostream& out, Objects& obj) {
//
return out;
}
//Implementation
和
friend ostream& operator<<(ostream& out, Object& obj);
//In the corresponding header file
我的问题是...为什么此函数在
ostream
和Object
的末尾需要“&”?至少我知道“&”用于...
但是,我认为它们都不适用于上述重载。我花了大量时间在谷歌搜索和阅读教科书上,但找不到答案。
任何建议将被认真考虑。
最佳答案
因为您通过引用传递了它们。
您为什么要通过引用传递它们。防止复制。
ostream& operator<<(ostream& out, Objects const& obj)
// ^^^^^ note the const
// we don't need to modify
// the obj while printing.
可以复制
obj
(潜在地)。但是,如果复制成本很高,该怎么办。因此最好通过引用传递它,以防止不必要的复制。out
的类型为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;
}
};
关于c++ - 为什么重载ostream的operator <<需要引用 “&”?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30272143/