友元函数+操作符重载
friend function + operator overloading
我正在做一个类的项目,这是一种工资单。提示符的一部分说
"你可以定义重载<<用于显示Employee对象信息(即重载<<函数将调用虚拟打印函数。)
我知道friend函数是什么,但是我不记得学过重载<<部分。我试着寻找一些简单的复制粘贴实现…但是无论我怎么做,我的编译器都会跳出来。
我该如何实现这个呢?下面是我到目前为止的代码:
#include <iostream>
#include <string>
using namespace std;
//Base class
class Employee
{
public:
Employee(string a, string b, string c, string d);
~Employee();
int virtual earnings();
void virtual print();
protected:
string first, last, brithday, department;
};
Employee::Employee(string f, string l, string b, string d)
{
first = f;
last = l;
brithday = b;
department = d; //department code
cout << "Employee created." << endl;
}
Employee::~Employee(void)
{
cout << "Employee deleted." << endl;
}
int Employee::earnings()
{
int earnings = 100; //To be added
return earnings;
}
void Employee::print()
{
//IDK
}
不要让<<
运算符迷惑了您。重载操作符归根到底只是命名函数的另一种方式。
如果你有这段代码:
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<<
返回对流本身的引用。注意,这里涉及到两种不同的operator<<
: std::string
是一个独立的函数,接受std::ostream
引用参数,int
和double
是std::ostream
成员函数。
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);
如果你想为你自己的类提供std::ostream
打印,你所要做的就是像std::string
那样做:提供一个独立的operator<<
,它接受std::ostream
引用和对你的对象的(const)引用,并返回对流的引用:
std::ostream &operator<<(std::ostream &stream, Employee const &employee)
{
// ...
return stream;
}
现在// ...
部分是朋友的事情开始发挥作用。为了正确打印Employee
,您需要访问其所有私有成员。提供此访问而不将其暴露给所有公众的最简单方法是将operator<<
声明为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;
相关文章:
- 重载操作符+:表达式必须是整型或无作用域枚举类型
- 重载操作符
- 如何重载操作符==外模板类使用友元函数
- 重载*操作符,使其在左右两边都工作
- 重载操作符<对于非随机迭代器
- 在c++中重载操作符的时间和原因
- 如何在c++中重载=操作符来通过引用进行复制
- 如何在c++中获取定义为友元的重载操作符的地址
- 使用重载操作符的文件操作表达式没有给出预期的结果
- 重载操作符()
- 重载操作符()并在类内使用
- 类中的重载操作符+
- 定时使用重载操作符
- c++带类的重载操作符
- 用列表容器重载[]操作符
- 重载操作符=
- 任何重载操作符()的静态检测
- 重载操作符以处理类对象
- 在使用另一个类的类中重载操作符==
- 派生类和基类中的重载操作符不同