左移运算符重载

视频链接

作用:可以输出自定义数据类型

我们正常情况下无法输出自定义数据类型。这个时候就需要重载<<运算符

注意,通常不会用成员函数重载<<运算符,因为无法实现cout在左侧

成员函数只有一个参数

1.通常不会用成员函数重载左移运算符,首先如果这么写:void operator<<(Perosn &p),这是错误的,cout哪去了呢。

2.而void operator<<(cout),调用时(本质:p.operator<<(cout))会变成p<<cout,cout在右边,实际应该是cout<<P,cout在左边。

只能通过全局函数重载左移运算符

如何查找cout属于什么数据类型?点击cout,右键,选择转到定义

可以看到cout属于ostream类,也就是输出流对象

// 本质 operator<<(cout,p),简化cout<<p;
// cout传入的必须是引用,不能是值。因为全局只有一个cout,不能创造出一个新的cout出来。
// 如果函数返回的是void,我们只能使用一次cout<<。
// 如果返回的是cout,那么我们每执行一次cout<<,就返回cout,这样就可以无限追加内容了。
//上面的规则称为链式规则。
// 传入的是osream &cout,返回的也应该是引用
ostream &operator<<(ostream &cout,Person &p) {cout << "p.m_A=" << p.m_A << "   " << "p.m_B=" << p.m_B;return cout;
}// 也可写成下面这样,把cout改成其他名字。但是调用的时候还是cout<<p
// 因为引用就是起别名
/*
ostream& operator<<(ostream &b,Person &p) {b << "p.m_A=" << p.m_A << "   " << "p.m_B=" << p.m_B;return b;
}
*/

重载运算符还可以和友元相结合

#include<iostream>
using namespace std;
#include<string>
// 左移运算符重载
// 作用:可以输出自定义数据类型
class Person {
// 友元,目的是让重载<<运算符的函数也可打印Person中的私有属性friend ostream& operator<<(ostream& cout, Person& p);friend void test01();
private:int m_A;int m_B;// 通常不会用成员函数重载左移运算符,因为不需要p.operator<<(p);这是错误的// 而void operator<<(cout),会变成p<<cout,cout在右边,实际应该是cout<<P,在左边};
// 本质 operator<<(cout,p),简化cout<<p;
//链式规则,返回cout,可以无限追加
// 如何知道cout属于什么数据类型呢?点击cout,右键:转到定义(或者按F12)
ostream& operator<<(ostream &cout,Person &p) {cout << "p.m_A=" << p.m_A << "   " << "p.m_B=" << p.m_B;return cout;
}void test01() {Person p; p.m_A = 10;p.m_B = 10;cout << "这是普通输出:" << endl;cout << "p.m_A=" << p.m_A << "    " << "p.m_B=" << p.m_B << endl<<endl;//链式规则,返回cout,可以无限追加cout << endl << "链式规则:" << endl;cout << p <<endl<<"hello,world"<<endl;}
int main() {test01();system("pause");return 0;
}

总结:1.重载左移运算符配合友元可以实现输出自定义数据类型
2.只能通过全局函数重载左移运算符
3.cout属于ostream类,并且重载函数必须传入的是cout的引用,返回的也必须是引用。→
ostream &(ostream &cout,Person p)。这样可以实现输出时无限追加内容。

左移运算符重载(C++)相关推荐

  1. 运算符重载——左移运算符重载

    目录: 运算符重载--算术运算符重载 运算符重载--递增运算符重载 运算符重载--左移运算符重载 运算符重载--赋值运算符重载 应用场景: 可以输出自定义的数据类型信息 Person p(" ...

  2. 4.2左移运算符重载

    左移运算符重载: 直接输出p是不行的,我们需要重载<< 注意,一般不会通过成员函数来重载左移运算符,因为那个样子cout就在<<的左侧了. 所以我们使用全局函数重载<&l ...

  3. C++左移运算符重载

    C++左移运算符重载 通过重载使得左移运算符可以输出自定义数据类型. 在类中定义成员函数实现不了左移运算符重载. 要在全局函数中实现左移运算符重载. 注:左移运算符的类型是ostream 过程如下: ...

  4. C++类与对象笔记十二:运算符重载二:左移运算符重载

    左移运算符重载:可以打印输出自定义数据类型. 为了输出重载,我们先看看现有的输出函数.输出类型为std下的ostream类型的引用. 标准输出流(全局只能有一个). 返回值类型为ostream,函数名 ...

  5. 【C++】有关<左移运算符重载>的总结

    大家好,我是翼同学! 目录 1️⃣前言 2️⃣左移运算符重载 4️⃣需注意的点 5️⃣写在最后 1️⃣前言 今天的笔记内容是: 左移运算符的重载 在类中,我们可以编写类的各种属性. 而左移运算符的重载 ...

  6. 运算符重载之左移运算符重载

    左移运算符重载 #include<iostream> using namespace std; class wood {friend ostream& operator<&l ...

  7. C++_类和对象_C++运算符重载_左移运算符重载_链式编程_实现直接打印对象---C++语言工作笔记056

    然后我们再去看左移运算符,实际上就是那个<< 小于号 为什么要重载他呢?因为我们想实现一个功能,比如我仅仅是cout << p 就可以打印这个对象,现在肯定是不行对吧. 我们用 ...

  8. C++学习之左移运算符重载

    在C++里,cout 后边加上<< 便可以输出数据,但是输出的只是一些变量,我现在想输出一个对象,所以需要重载一下<<. 例如我创建了一个class person{ }; pe ...

  9. c++中运算符重载(加号运算,左移运算,前置后置++运算符,赋值运算,关系运算,函数运算)

    运算符重载注意 重载的运算符要易读 内置的数据类型的表达式的运算符是不可以改变的 不要重载&& 和 | | 运算符 =,[]和->运算符只能通过成员函数进行重载 << ...

最新文章

  1. UIButton文字居左显示
  2. 密码界“女杀手”,破译世上最安全密码系统,获 771 万奖金!
  3. java程序解压/压缩.gz文件
  4. CUBRID学习笔记 31 通过select创建表
  5. MySQL调优(一):使用profiles、performance_schema性能监控
  6. 点击率预测算法:FTRL
  7. 关于指针,可能是网上最详细的讲解了
  8. java程序调用Oracle 存储过程 获取返回值(无返回,非结果集,结果集)
  9. mysqldump 忽略视图_Mysql备份迁移——Mysqldump(.NET调用Mysqldump.exe方式)——(解决视图嵌视图报错)...
  10. 容器编排技术 -- Kubernetes kubectl create deployment 命令详解
  11. c语言边沿与内芯的差noj题目,西工大noj答案完整版148.doc
  12. C# WinForm 判断程序是否已经在运行,且只允许运行一个实例,附源码
  13. JVM常用的配置参数整理
  14. Git 代码防丢指南,再也不怕丢失代码了!
  15. Java Script 基本知识点
  16. mysql 中国省份城市数据库表
  17. 国际贸易术语解释通则(DDU 未完税交货(……指定目的港))
  18. xp系统怎么创建新宽带连接服务器地址,XP宽带连接怎么创建?
  19. jsp70786体育馆售票门票系统
  20. 定时开关机(二):AlarmManager的使用及对定时不准问题的修改

热门文章

  1. activiti工作流架构介绍及集成实现
  2. Java支付宝电脑网站支付
  3. Flac是什么格式,flac文件怎么转换为wav格式
  4. 释放法:圣多纳释放法黄金六步
  5. DockerKubernetes ❀ Docker的在线安装、离线安装、配置镜像加速器、配置文件参数详解
  6. PC微信3.7.0内测发布:存储空间有救了
  7. 史上最新 PHP 调用 jar包教程
  8. vivo系列某些机型的浏览器不支持Chrome调试
  9. 华为信号怎么测试软件,实地测试 信号强度是关键
  10. linux u盘无法读写,解决Linux无法读写U盘中的NTFS问题