C++重载输入运算符<<自定义打印类信息

来源:互联网 发布:node.js高级编程 微盘 编辑:程序博客网 时间:2024/06/06 05:22

C++里面,我们想打印类的信息,需要重载<<运算符,这篇博客将介绍如何重载<<运算符打印类消息。并且介绍这么做的一些规则和原因。

重载<<运算符打印自定义类信息

我们用代码来进行说明:我们定义一个Person类,想要打印出Person类实例的age属性。

Person{  private:    int age_;  public:    void SetAge(int age)    {    age_ = age;    }}int main(){    Person a;    a.SetAge(10);    cout << a << endl;}

这样写肯定会报错,运行失败的(头文件引用,命名空间等偷懒了没写,不要在意这些细节)。我们想要 cout << a自动打印出年龄怎么办?

我们这么写,多加一个重载<<运算符的方法:

class Person{    int age_;  public:    void SetAge(int age)    {        this->age_ = age;    }    friend ostream &operator<<(ostream &stream, const Person &p)    {        stream << p.age_ << endl;        return stream;    }};int main(){    Person a;    a.SetAge(10);    cout << a << endl;}

运行程序可以看到打印出了10。
在这里,我们用一个友元函数来进行<<运算符重载,这个友元函数有个固定的格式:

friend ostream &operator<<(ostream &stream, const Person &p){    stream << p.age_ << endl;    return stream;}

为了与IO标准库一致,要返回一个ostream对象的引用,接受两个参数,第一个参数是对一个ostream对象的应用,,第二个参数为一个想要打印的类类型对象的引用,你想要cout<<打印一个Person类,第二个参数就传入一个Person类的引用,这个函数也要定义成友元类。

为什么要把这个<<运算符重载定义为友元类

从语法上来说,我们的确可以把这个函数定义为类成员函数的,如下:

class Person{    int age_;  public:    void SetAge(int age)    {        this->age_ = age;    }    ostream &operator<<(ostream &stream)    {        stream << age_ << endl;        return stream;    }};int main(){    Person a;    a.SetAge(11);    a << cout;}

就如代码里所示,我们把关键字friend去掉了,把第二个参数给去掉了,然后使用a << cout来打印类信息了。可以看到,如果这样定义,和其它类型的输出操作符相反了。
下面引用一段C++primer里的一段话:
相反,如果想要使用重载操作符为该类型提供 IO 操作,就必须将它们定义
为非成员函数。IO 操作符通常对非公用数据成员进行读写,因此,类通常将 IO
操作符设为友元。

也就是说,IO操作符重载函数,通常被定义为友元函数。

原创粉丝点击