C++ 重载 << 运算符
C++ overloading the << operator
我正在尝试重载 C++ 中的 << 运算符,我已经正确实现了代码,但我对重载概念的整体工作有一些疑问。
- 为什么operator<<函数中的ostream对象需要传递
通过参考?
为什么函数的 return 类型不能是 'std::ostream' 而不是
'std::ostream&' ?
是ostreamclass的属性需要
'operator<<'函数到return一个内存地址或者做所有的
运算符重载需要通过引用传递并且 return
类型也应该是参考?
这是代码。
#include<iostream>
enum MealType{NO_PREF,REGULAR,LOW_FAT,VEGETARIAN};
struct Passenger{
char name[30];
MealType mealPref;
bool freqFlyer;
int passengerNo;
};
//Overloading the << operator
std::ostream& operator<<(std::ostream& out,const Passenger& pass){
out<<pass.name<<" "<<pass.mealPref;
if(pass.freqFlyer){
out<<" "<<"Passenger is a freqent flyer ";
}
else{
out<<" "<<"Passenger is not a frequent flyer ";
}
return out;
}
int main(){
Passenger p1 = {"Jacob",LOW_FAT,false,2342};
std::cout<<p1;
return 0;
}
编辑 1:
为什么我必须在重载函数定义中使用 << 运算符。它的功能是像移位还是像 << in std::cout<<" ";
并非所有运算符重载都需要通过引用传递。例如,如果你写了一个 class 封装了一个 2D 点,你为其中两个做了一个 operator-
,你可能会按值获取参数(因为它们是小而简单的类型 "value semantics"),并且它将 return 按值计算距离(因为可能没有可以 returned 的预分配距离对象,您正在创建一个新对象)。即:
dist2d operator-(point2d a, point2d b) {
return {a.x - b.x, a.y - b.y};
}
std::ostream
不可复制,因为复制一个流(不包含其自己的历史记录)意味着什么?所以你必须始终通过引用或指针传递它。
我正在尝试重载 C++ 中的 << 运算符,我已经正确实现了代码,但我对重载概念的整体工作有一些疑问。
- 为什么operator<<函数中的ostream对象需要传递 通过参考?
为什么函数的 return 类型不能是 'std::ostream' 而不是 'std::ostream&' ?
是ostreamclass的属性需要 'operator<<'函数到return一个内存地址或者做所有的 运算符重载需要通过引用传递并且 return 类型也应该是参考?
这是代码。
#include<iostream>
enum MealType{NO_PREF,REGULAR,LOW_FAT,VEGETARIAN};
struct Passenger{
char name[30];
MealType mealPref;
bool freqFlyer;
int passengerNo;
};
//Overloading the << operator
std::ostream& operator<<(std::ostream& out,const Passenger& pass){
out<<pass.name<<" "<<pass.mealPref;
if(pass.freqFlyer){
out<<" "<<"Passenger is a freqent flyer ";
}
else{
out<<" "<<"Passenger is not a frequent flyer ";
}
return out;
}
int main(){
Passenger p1 = {"Jacob",LOW_FAT,false,2342};
std::cout<<p1;
return 0;
}
编辑 1: 为什么我必须在重载函数定义中使用 << 运算符。它的功能是像移位还是像 << in std::cout<<" ";
并非所有运算符重载都需要通过引用传递。例如,如果你写了一个 class 封装了一个 2D 点,你为其中两个做了一个 operator-
,你可能会按值获取参数(因为它们是小而简单的类型 "value semantics"),并且它将 return 按值计算距离(因为可能没有可以 returned 的预分配距离对象,您正在创建一个新对象)。即:
dist2d operator-(point2d a, point2d b) {
return {a.x - b.x, a.y - b.y};
}
std::ostream
不可复制,因为复制一个流(不包含其自己的历史记录)意味着什么?所以你必须始终通过引用或指针传递它。