<C++>运算符重载进阶之左移运算符,输出成员属性一步到位

简介: <C++>运算符重载进阶之左移运算符,输出成员属性一步到位

左移运算符


形如"<<"


定义


       C++中左移运算符就是标准的一个输出流类创建的一个输出流对象,通俗点是"cout<<"后的合法内容会被输出到终端并显示。


目的


       解决直接输出类成员属性的问题:通过重载左移运算符一次性输出成员的属性。


详解重载过程


       函数名用编译器提供的operator<<


具体形式


学生类示例:


class Student
{
  friend ostream &operator<<(ostream& out, Student& s);
public:
  Student(int h, int w)
  {
    this->s_hight = h;
    this->s_weight = w;
  }
private:
  int s_hight;
  int s_weight;
};

       这个学生类有两个私有属性身高和体重以及一个有参构造方法来给私有属性赋值,然后开头是一个友元的声明,目的是让重载的运算符可以访问身高和体重这两个私有属性,不理解friend关键字的朋友们可以看看我端午节发的关于C++的友元知识🎉友元的所有形式🎉



       类比上次的加号运算符重载,左移运算符重载应该可以有两种方式,即成员函数实现和全局函数实现,但是成员函数是不常用的,看接下来的解释。


不建议成员函数实现

ostream& operator<<(ostream& cout)
  {
    cout << "该学生身高为:"<< this->s_hight;
    cout << "该学生体重为:"<< this->s_weight;
    return cout;
  }


调用形式:


void test1()
{
  Student S1(180, 130);
  S1 << cout<<"\nHello World";
}


       这个是可以运行的,但是看着太别扭了,由于是成员函数,需要用对象调用该函数,那么对象就得写前面,要是自己看还好,要是给别人看还不得被笑死 ,所以我很不推荐用成员函数实现左移的重载,至于重载的函数为什么这样写,在我下面展示完全局函数实现重载的时候会一一详解,往下看。


全局函数实现

ostream &operator<<(ostream &out, Student& s)
{
  out << "该学生身高为:" << s.s_hight << "\t该学生体重为:" << s.s_weight ;
  return out;
}


调用形式:


void test()
{
  Student S(182, 140);
  cout << S << "\t还没结束" << endl;
}


       重载的函数名是operator<<,传入的参数是ostream &cout Student &s,返回值类型也是ostream &cout ,其实ostream cout的类型,而cout又代表着标准输出流,我们可以这样看:在编译器找到cout,右键后选择速览定义,效果如下:


image.png


       可以看到cout的定义是ostream类 ,cout是标准输出类的对象,这是静态地址,所以我们传参的时候要传入引用,以免产生副本;而且返回的时候也要返回该对象的引用形式,不然返回的地址不一样,而对象值作为返回值会调用拷贝构造函数在新的地址生成新的cout,这是肯定行不通的。因此返回值和参数都采用标准输出类的对象引用,而且这样符合链式编程的特点。可以不断增加"<<"来增加输出的内容。


运行效果:


image.png

相关文章
|
20小时前
|
编译器 C语言 C++
从C语言到C++⑤(第二章_类和对象_中篇)(6个默认成员函数+运算符重载+const成员)(下)
从C语言到C++⑤(第二章_类和对象_中篇)(6个默认成员函数+运算符重载+const成员)
4 1
|
1天前
|
C++
C++程序中的赋值运算符
C++程序中的赋值运算符
10 2
|
1天前
|
C++
C++程序中的派生类成员访问属性
C++程序中的派生类成员访问属性
9 1
|
1天前
|
程序员 C++
C++程序中的运算符重载
C++程序中的运算符重载
9 2
|
1天前
|
C++
C++程序中对象成员的引用
C++程序中对象成员的引用
7 2
|
4天前
|
测试技术 C++
C++|运算符重载(3)|日期类的计算
C++|运算符重载(3)|日期类的计算
|
4天前
|
C语言 C++
C++|运算符重载(2)|运算符重载的方法与规则
C++|运算符重载(2)|运算符重载的方法与规则
|
20小时前
|
存储 编译器 C语言
从C语言到C++_11(string类的常用函数)力扣58和415(中)
从C语言到C++_11(string类的常用函数)力扣58和415
5 0
|
20小时前
|
存储 C语言 C++
从C语言到C++_11(string类的常用函数)力扣58和415(上)
从C语言到C++_11(string类的常用函数)力扣58和415
5 0
|
20小时前
|
存储 编译器 程序员
从C语言到C++④(第二章_类和对象_上篇)->类->封装->this指针(下)
从C语言到C++④(第二章_类和对象_上篇)->类->封装->this指针
4 0