友元函数+操作符重载

friend function + operator overloading

本文关键字:重载 操作符 函数 友元      更新时间:2023-10-16

我正在做一个类的项目,这是一种工资单。提示符的一部分说

"你可以定义重载<<用于显示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引用参数,intdoublestd::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;