友元函数+运算符重载

时间:2014-03-09 06:29:31

标签: c++ operator-overloading friend

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

“您可以定义一个重载<<用于显示Employee对象信息的友元函数(即重载<<函数将调用虚拟打印函数。)”

我知道朋友的功能是什么,但我不记得了解过载<<部分。我试着寻找一些简单的复制粘贴实现...但无论我尝试什么,我的编译器都会爆发。

我如何实际实施此功能?这是我到目前为止的代码:

#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 
}

1 个答案:

答案 0 :(得分:6)

不要让<<操作员混淆你。在一天结束时,重载的运算符只是命名函数的另一种方式

如果你有这段代码:

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的{​​{1}}是free-standing function引用std::ostream引用参数,intdouble std::ostreamint i = 1; std::string s = "x"; double d = 0.5; print(std::cout, s).print(i).print(d); member functions

有了这些知识,我们很容易想象,我们只会处理通常命名的函数,例如: “打印”:

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,其中std::ostream &operator<<(std::ostream &stream, Employee const &employee) { // ... return stream; } 引用和对象的(const)引用,它返回对流的引用:

// ...

现在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;

你去,为你的员工完美打印:

{{1}}