不要让
<<
操作员会让您困惑。过载的操作员在一天结束时
命名函数的另一种方法
.
如果您有这段代码:
int i = 1;
std::string s = "x";
double d = 0.5;
std::cout << s << i << d;
这只是另一种说法:
int i = 1;
std::string s = "x";
double d = 0.5;
std::operator<<(std::cout, s).operator<<(i).operator<<(d);
顺便说一下,这使得链接调用的工作更加明显,因为
operator<<
返回对流本身的引用。请注意,有两种不同类型的
运算符<&书信电报;
此处涉及:
std::string
是一个
free-standing function
拍摄
std::ostream
引用参数,用于
int
和
double
是
标准::ostream
member functions
.
有了这些知识,我们很容易想象,我们只是在处理通常命名的函数,例如“print”:
int i = 1;
std::string s = "x";
double d = 0.5;
print(std::cout, s).print(i).print(d);
事实上,你可以想象没有
超载,超载
但它们都有不同的名字。这使得整个事情更容易理解:
int i = 1;
std::string s = "x";
double d = 0.5;
printStringOnStream(std::cout, s).printInt(i).printDouble(d);
如果您想提供
标准::ostream
为自己的班级打印,你所要做的就是像这样
std::字符串
:提供独立式
运算符<&书信电报;
这需要
标准::ostream
引用和对对象的(const)引用,并返回对流的引用:
std::ostream &operator<<(std::ostream &stream, Employee const &employee)
{
// ...
return stream;
}
现在
// ...
一部分是朋友的作用。为了正确打印
Employee
,您需要访问其所有私人成员。提供这种访问而不向公众公开的最简单方法是声明您的
运算符<&书信电报;
的朋友
受雇者
:
class Employee
{
// ...
friend std::ostream &operator<<(std::ostream &stream, Employee const &employee);
};
std::ostream &operator<<(std::ostream &stream, Employee const &employee)
{
stream << employee.earnings; // and so on
return stream;
}
好了,为您的员工提供完美的打印:
std::cout << "xyz" << my_employee << "abc" << 0.5 << 1;