对类的<<操作符声明为友元函数的理解

140 阅读1分钟
#include <iostream>
using namespace std;

class Test
{
public:
    Test(int _a, int _b)
    {
        a = _a;
        b = _b;
    }

    // 1)C++中引入友元函数,是为在该类中提供一个对外(除了他自己意外)访问的窗口;
    // 2)这个友元函数他不属于该类的成员函数,他是定义在类外的普通函数,只是在类中声明该函数
    //   可以直接访问类中的private或者protected成员。
    // 3)类中通过使用关键字friend 来修饰友元函数,但该函数并不是类的成员函数,其声明可以放在
    //   类的私有部分,也可放在共有部分。友元函数的定义在类体外实现,不需要加类限定

    // 这里之所以声明为友元函数,原因为:
    // 首先<<操作符应定义为非成员函数,因为如果是成员函数,则左操作数必须为类对象,
    // 但实际使用时类似这样:cout << test,因此第一个参数必然不是类对象,与此相违背。
    // 而一般这种运算符都会访问类的私有成员变量,因此将该函数声明为友元函数
    friend ostream& operator<<(ostream& out, const Test& test)
    {
        out << test.a << "\t" << test.b;
        return out;
    }
    int a;
    int b;
};

int main()
{
    Test test(100, 200);
    cout << test; // 输出 100    200
    return 0;
}

ostream 表示输出流,out 是 ostream 类的对象。由于采用了引用的方式进行参数传递,并且也返回了对象的引用,所以重载后的运算符可以实现连续输出: 如:cout << testa << testb;