首页 > 编程语言 >C++左移运算符重载的理解

C++左移运算符重载的理解

时间:2024-10-25 11:21:57浏览次数:3  
标签:cout int 左移 C++ 运算符 ostream 重载 函数

最近学习C++学到了运算符重载的部分,大部分运算符重载都就可以实现作为类中成员函数和全局函数进行重载实现,而左移运算符“<<”却只支持全局函数进行重载。这是是为什么呢?我来谈谈我的理解。

大家首先随便用cout输出一下,然后点击cout然后右键选择转到声明:

我们会看到如下图显示的,它的大概意思就是cout其实是编译器为我们创建了一个ostream类的一个对象。值得注意的是,整个编译器中,有且仅有这一个输出流ostream类的对象!(其实也可以自己创建,只不过要实现默认cout的作用要设置很多东西,并不是简单的ostream p;就可以创建出和cout等效的对象)

 接下来我们来理解以下cout使用的方法

int a = 1025;
cout << a;

这句的意思是打印1025的数值,其中cout << a;可以这样理解,cout是一个数据流类,<< 是operator<<()的函数简写,a则是传入参数,所以可以理解这一步的意思是cout.operator<<(int a),然后编译器就理解这就是打印一个int数据类型的操作。但是值得注意的是我们常规使用的时候,打印是可以连续打印的。例如我们打印的cout << a << endl。我们知道调用函数是由返回值类型的,如果返回为void,显然后续void.operator<<(char '\n')是不存在的,也就是不合法的操作。如何才能正确进行操作呢,大家是不是已经想到了,返回值改成一个ostream类的一个对象就可以链接起来了!同时值得注意的是因为编译器就只有一个输出流ostream类的对象即cout所以我们要引用的形式进行接收。故此我们可以确定operator<<()的声明为ostream& operator<<(ostream&,---);---可为int,double,等等数据类型。说到这里我就为大家放上一份代码。

#include<iostream>
using namespace std;

class AA
	{
public:
	int m_a;
	int m_b;
public:
	
	};
 ostream & operator<<(ostream &hh , AA& p)//ostream是个类,且对象只有一个,所以必须加&
	 {
	 hh << "m_a = " << p.m_a << "  m_b" << p.m_b;
	 return hh;
	 }
void test02()
	{
	 AA p;
	 p.m_a = 10;
	 p.m_b = 10;

	 cout << p.m_a << endl;
	 cout << p << endl; //operator<<(cout , p)
	}

int main()
	{
	
	test02();
	system("pause");
	return 0;
	}

这份代码的实现是依靠全局函数重载左移运算符的。那么为什么不用成员函数实现呢?

大家来看,cout << p如果定义的全局函数是不是可以理解为operator<<(ostream &cout , AA& p)

。如果我定义为成员函数operator<<(ostream &cout,AA& p ),我想和全局函数实现cout << p相同的内容,是不是需要用p1 cout << p;这种形式来写?我必须得先告诉这是那个对象的成员函数才能调用对不对?这种写法显然不存在!故此左移运算符"<<"不支持作为成员函数进行重载。

标签:cout,int,左移,C++,运算符,ostream,重载,函数
From: https://blog.csdn.net/weixin_55017074/article/details/143226653

相关文章

  • C++ 内存管理 堆和栈、内存泄漏、内存分配、指针与内存、智能指针、malloc和free、new
    1.堆和栈的区别1.**管理方式**:-**栈**:自动管理。当函数调用时,局部变量会自动分配在栈上。函数执行完毕后,这些变量会自动释放。-**堆**:手动管理。程序员需要使用`new`来在堆上分配内存,并在不再需要时使用`delete`来释放。2.**使用方式和寿命**:-**栈**:用......
  • C++ 好用的包管理工具--vcpkg
    https://blog.csdn.net/lizhichao410/article/details/132339064 背景Windows下开发C/C++程序,少不了编译开源的第三方库,使用这些库开发极大的方便了程序员,使得我们不必重复造轮子。由于开源库绝大部分都来源于Linux系统、将其移植到Windows的VC开发环境下编译比较复......
  • 【32】C++流
    C++流IO: 向设备输入数据和输出数据C++的IO流设备: 文件控制台特定的数据类型(stringstream)c++中,必须通过特定的已经定义好的类, 来处理IO(输入输出)读写文件:文件流文件流: 对文件进行读写操作头文件:  <fstream>类库:   ifstream   对文件输入(读......
  • C++的汉诺塔
    汉诺塔(TowerofHanoi)是一个经典的递归问题。问题的描述如下:有三根杆(通常称为A、B、C),以及一系列大小不同、穿在一根杆上的圆盘。这些圆盘可以滑动到任何一根杆上,但是每次只能移动一个圆盘,且不能将较大的圆盘放在较小的圆盘上。目标是将所有圆盘从杆A移动到杆C。下......
  • springboot巡更系统--10192(免费领源码)可做计算机毕业设计JAVA、PHP、爬虫、APP、小程
    摘 要目前,在日常生活中随处可见社区巡更人员对特定的区域进行定期或者不定期的安全巡查管理。包括勤前训示、必到点签到、巡更路线等,各项勤务工作均由巡更员本人在执勤日志本中手工填写,且工作点分散,不利于统一监管,存在信息化手段不足,勤务信息获取、输入复杂,监管信息不能实时......
  • 【最新原创毕设】基于JSP+SSM的民宿预约平台+79197(免费领源码)可做计算机毕业设计JAVA
    目录摘要1绪论1.1选题背景与意义1.2国内外研究现状2系统分析2.1.1技术可行性分析2.1.2 经济可行性分析2.1.3法律可行性分析2.2系统流程分析2.2.1添加信息流程2.2.2修改信息流程2.2.3删除信息流程2.3 系统功能分析2.3.1功能性分析2.3......
  • C++中的内存管理
    下图是C++的内存储存管理的方式  由图不难得知,局部变量是储存在栈中的,而malloc,calloc,realloc开辟出来的空间是储存在堆中的,全局数据和静态变量储存在数据段中,也叫静态区.代码段存的是可执行代码和只读常量。 C语言中动态内存管理方式:malloc/calloc/realloc/f......
  • C++模板
    模板初阶如何实现一个通用的加法函数?我们可以类似这样使用函数重载的方法进行编写intsum(int&a,int&b){ returna+b;}doublesum(double&a,double&b){ returna+b;}使用函数重载虽然可以实现,但是有一下几个不好的地方:1.重载的函数仅仅是......
  • C++ Mutex
    定义互斥量可以使用在各种方面,常用在对共享数据的读写上。如果有多线程读写一个数据,那么想要保证线程安全,必须对共享变量的读写上锁头文件#include<mutex>类型std::mutex,最基本的Mutex类std::recursive_mutex,递归Mutexstd::time_mutex,限时Mutexstd::recursive_timed_......
  • 每日OJ题_牛客_DP10最大子矩阵_二维前缀和_C++_Java
    目录牛客_DP10最大子矩阵_二维前缀和题目解析C++代码Java代码牛客_DP10最大子矩阵_二维前缀和最大子矩阵_牛客题霸_牛客网(nowcoder.com)描述:        已知矩阵的大小定义为矩阵中所有元素的和。给定一个矩阵,你的任务是找到最大的非空(大小至少是1*1)子矩......