<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

相关文章
|
1月前
|
存储 编译器 C++
【C++】深入探索类和对象:初始化列表及其static成员与友元(一)
【C++】深入探索类和对象:初始化列表及其static成员与友元
|
1月前
|
编译器 C语言 C++
C++入门3——类与对象2-2(类的6个默认成员函数)
C++入门3——类与对象2-2(类的6个默认成员函数)
23 3
|
1月前
|
存储 编译器 C++
C++入门3——类与对象2-1(类的6个默认成员函数)
C++入门3——类与对象2-1(类的6个默认成员函数)
30 1
|
1月前
|
存储 编译器 数据安全/隐私保护
【C++篇】C++类与对象深度解析(四):初始化列表、类型转换与static成员详解2
【C++篇】C++类与对象深度解析(四):初始化列表、类型转换与static成员详解
29 3
|
1月前
|
编译器 C++
【C++篇】C++类与对象深度解析(四):初始化列表、类型转换与static成员详解1
【C++篇】C++类与对象深度解析(四):初始化列表、类型转换与static成员详解
45 3
|
1月前
|
C++
【C++】深入探索类和对象:初始化列表及其static成员与友元(二)
【C++】深入探索类和对象:初始化列表及其static成员与友元
|
1月前
|
编译器 C++
【C++】深入探索类和对象:初始化列表及其static成员与友元(三)
【C++】深入探索类和对象:初始化列表及其static成员与友元
|
2月前
|
C++
【C++基础】运算符详解
这篇文章详细解释了C++中运算符的用法,包括算术运算符、赋值运算符、比较运算符和逻辑运算符,以及它们在表达式中的作用和示例。
28 2
|
2月前
|
C++
C++(十五) 运算符重载
C++中的运算符重载允许对已有运算符的功能进行重新定义,从而扩展语言功能、简化代码并提升效率。重载遵循特定语法,如 `friend 类名 operator 运算符(参数)`。重载时需注意不可新增或改变运算符数量、语义、优先级、结合性和返回类型。常见示例包括双目运算符 `+=` 和单目运算符 `-` 及 `++`。输入输出流运算符 `&lt;&lt;` 和 `&gt;&gt;` 也可重载。部分运算符只能作为成员函数重载。
|
3月前
|
C++
c++学习笔记02 运算符
C++学习笔记,介绍了C++中的运算符,包括基本的加减乘除、求模、前后置递增递减、赋值运算符、比较运算符和逻辑运算符的使用及其注意事项。
40 6