【C++】运算符重载 ⑧ ( 左移运算符重载 | 友元函数 / 成员函数 实现运算符重载 | 类对象 使用 左移运算符 )

news2025/2/24 3:28:58

文章目录

  • 一、左移运算符重载
    • 1、友元函数 / 成员函数 实现运算符重载
    • 2、类对象 使用 左移运算符
    • 3、左移运算符 << 重载
  • 二、完整代码示例





一、左移运算符重载




1、友元函数 / 成员函数 实现运算符重载


运算符重载 的正规写法一般都是 使用 成员函数 的形式 实现的 ;

  • 加法 + , 减法 - , 自增 ++ , 自减 - - , 一般都使用成员函数 实现 运算符重载 ;

上述 运算符重载 既可以使用 成员函数 进行重载 , 又可以使用友元函数进行重载 ;


只能使用 成员函数 重载的运算符 : = , [] , () , -> 等操作符 只能使用 成员函数 进行重载 ;

只能使用 友元函数 重载的运算符 : 无法修改 左操作数 的情况下 , 只能使用 全局函数 ( 需声明 友元函数 ) 进行重载 ;


2、类对象 使用 左移运算符


平时使用 cout 与 左移操作符 << 向命令行输出数据时 , 只能输出 基础数据类型 和 字符串 ;

cout << "age = " << age << endl; 

如果 , 想要输出 自定义类对象 , 直接使用下面的代码 , 会报错 ;

	// 自定义类型相加
	Student s1(10, 120), s2(18, 170);

	// 输出对象
	cout << s1 << endl;

编译时 , 会提示 如下错误 :

error C2679: 二进制“<<: 没有找到接受“Student”类型的右操作数的运算符(或没有可接受的转换)

在这里插入图片描述

如果想要使用 cout << s1 << endl; 用法输出对象到日志中 , 需要重载 左移操作符 ;


3、左移运算符 << 重载


使用 全局函数 实现 左移运算符 << 重载 :

  • 首先 , 写出函数名 , cout << s1 左移操作符重载 , 函数名规则为 " operate " 后面跟上要重载的运算符 , 函数名是 operate<< ;
operate<<
  • 然后 , 根据操作数 写出函数参数 , 参数一般都是 对象的引用 ;
    • cout << s1 左操作数是 ostream cout 标准输出流 , 参数中是引用类型 ;
    • cout << s1 右操作数是 Student s 类对象 , 参数中是引用类型 ;
operator<<(ostream& out, Student& s)
  • 再后 , 根据业务完善返回值 , 返回值可以是 引用 / 指针 / 元素 ; 此处返回 void 即可 ; 返回 ostream& 引用类型 , 是为了支持链式调用 cout << s1 << endl;
ostream& operator<<(ostream& out, Student& s)
  • 最后 , 实现函数体 , 编写具体的运算符操作业务逻辑 ;
// 全局函数 中实现 Student 左移运算符重载
// 返回 ostream& 引用类型 , 是为了支持链式调用 cout << s1 << endl;
ostream& operator<<(ostream& out, Student& s)
{
	// 在函数体中将 Student 对象数据输出到 out 输出流中
	out << s.age << " , " << s.height << endl;

	// 该返回值还需要当左值使用
	return out;
}




二、完整代码示例



代码示例 :

#include "iostream"
using namespace std;

class Student
{
public:
	// 带参构造函数 , 为参数设置默认值
	Student(int age = 1, int height = 1)
	{
		this->age = age;
		this->height = height;
	};

public:
	// 打印类数据
	void print()
	{
		cout << "age = " << age << " , height = " << height << endl;
	};

public:
	int age;		// 年龄
	int height;		// 身高
};

// 全局函数 中实现 Student 左移运算符重载
// 返回 ostream& 引用类型 , 是为了支持链式调用 cout << s1 << endl;
ostream& operator<<(ostream& out, Student& s)
{
	// 在函数体中将 Student 对象数据输出到 out 输出流中
	out << s.age << " , " << s.height << endl;

	// 该返回值还需要当左值使用
	return out;
}

int main() {
	// 自定义类型相加
	Student s1(10, 120), s2(18, 170);

	// 输出对象 , 此时 函数执行返回值 当左值
	cout << s1;

	// cout << s1 返回了 ostream& 类型引用
	// 然后执行 ostream cout << endl 
	cout << s1 << endl;

    // 控制台暂停 , 按任意键继续向后执行
    system("pause");

    return 0;
};

执行结果 :

10 , 120
10 , 120

请按任意键继续. . .

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1064075.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

DLRover - 小记

文章目录 关于 DLRover 关于 DLRover github : https://github.com/intelligent-machine-learning/dlrover DLOver使大型人工智能模型的分布式训练变得简单、稳定、快速和绿色。 它可以在分布式集群上自动训练深度学习模型。 它帮助模型开发人员专注于模型结构&#xff0c;而…

手把手教你从零开始腾讯云服务器部署(连接建站教程)

使用腾讯云服务器搭建网站全流程&#xff0c;包括轻量应用服务器和云服务器CVM建站教程&#xff0c;轻量可以使用应用镜像一键建站&#xff0c;云服务器CVM可以通过安装宝塔面板的方式来搭建网站&#xff0c;腾讯云服务器网txyfwq.com分享使用腾讯云服务器建站教程&#xff0c;…

双周回顾#001 - 火烧云

工作以来&#xff0c;许久未曾见过如此壮观的火烧云景观了。 文章 1、穿透的 DIV &#xff08;pointer-events&#xff09;1 pointer-events 是一个蛮有趣的 CSS3 属性&#xff0c;虽然主要是针对 SVG &#xff0c;但其中几个属性应用在 div 上也是颇有意思。 顾名思义&…

学会自我投资:美团四大名著之<高效能人士的七个习惯>

你有没有这些问题&#xff1f;如果有&#xff0c;那么本文也许对你有用。 受害者心理&#xff0c;如果有人对你说粗话&#xff0c;就怼回去。消极被动。 没有计划。没有目标。不会担心自己的行为带来的后果。随波逐流。及时行乐&#xff0c;做个玩世不恭者。 拖延。总是先做紧…

vue +element 批量删除

1.拿到当前勾选状态 在el-table里边去写 单选用第一个 多选用第二个 select"selectHandle" :当用户手动勾选数据行的 Checkbox 时触发的事件 select-all"selectHandle":当用户手动勾选全选 Checkbox 时触发的事件// 点击勾选选择器selectHandle(selection…

机器学习:决策树

决策树 决策树是一种基于树形结构的模型&#xff0c;决策树从根节点开始&#xff0c;一步步走到叶子节点&#xff08;决策&#xff09;&#xff0c;所有的数据最终都会落到叶子节点&#xff0c;既可以做分类也可以做回归。 特征选择 根节点的选择该用哪一个特征呢&#xff…

【python海洋专题十二】年平均的南海海表面温度图

【python海洋专题十二】年平均的南海海表面温度图 上期内容 南海水深图 本期内容 年平均的南海平面温度图 数据来源 NCEP/DOE Reanalysis II: NOAA Physical Sciences Laboratory NCEP/DOE Reanalysis II skt.skt.sfc.mon.ltm.nc Part01. 本文重点内容 前几期地形图&a…

SSM - Springboot - MyBatis-Plus 全栈体系(二十一)

第四章 SpringMVC 四、RESTFUL 风格设计和实战 1. RESTFul 风格概述 1.1 RESTFul 风格简介 RESTful&#xff08;Representational State Transfer&#xff09;是一种软件架构风格&#xff0c;用于设计网络应用程序和服务之间的通信。它是一种基于标准 HTTP 方法的简单和轻量…

QT基础入门——QMainWindow与对话框QDialog

前言&#xff1a; Qt 并没有专门的菜单项类&#xff0c;只是使用一个QAction类&#xff0c;抽象出公共的动作。当我们把QAction对象添加到菜单&#xff0c;就显示成一个菜单项&#xff0c;添加到工具栏&#xff0c;就显示成一个工具按钮。用户可以通过点击菜单项、点击工具栏按…

visual studio解决bug封装dll库

1.速度最大化 O2 2.设置输出目录 配置属性/常规/输出目录 链接器/常规/输出dll文件 链接器/调试/输出程序数据库pdb文件 链接器/高级/导入库 3.输出X86 X64分别对应的dll、lib、pdb 然后修改更新说明 更新说明格式如下&#xff1a; 4.将库提交到FTP每日更新库文档下 和测试交接…

运维/全栈必备Window指令

运维/全栈必备Window指令 前言 大家好 我是寸铁 除了Linux有常用的命令 Windows也有 下面让我们一起来看看吧! 总共是40个命令&#xff0c;按照前缀大致划分成25个命令。 便于系统学习和掌握。 需要用到的快捷键&#xff1a; 复制键&#xff1a; ctrl insert退出键&#x…

JTAG/SWD接口定义

目录 1. ST-Link接口定义 2. ULINK2接口定义 为方便查阅&#xff0c;将ST-LINK和ULINK的JTAG和SWD接口定义总结如下&#xff1a; 1. ST-Link接口定义 Pin no. ST-LINK/V2 connector (CN3) ST-LINK/V2 function Target connection (JTAG) Target connection (SWD) 1 VA…

Linux:环境变量、地址空间

目录 一、环境变量 1、什么是环境变量 2、常见的环境变量 3、环境变量相关命令 二、地址空间 1、进程地址空间 2、虚拟地址空间 一、环境变量 1、什么是环境变量 首先先举个环境变量的例子&#xff1a; 我们在Linux中&#xff0c;运行ls、pwd之类的命令&#xff0c;直…

RabbitMQ学习笔记(下):延迟队列,发布确认高级,备份交换机

十、延迟队列 延迟队列 概念&#xff1a; 延迟队列使用场景&#xff1a; 流程图&#xff1a; 延迟队列整合Springboot 导入依赖&#xff1a; <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot…

基于SSM的电脑硬件库存管理系统的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

物联网AI MicroPython传感器学习 之 IR人体红外传感器

学物联网&#xff0c;来万物简单IoT物联网&#xff01;&#xff01; 一、产品简介 热释电红外运动传感器能检测运动的人或动物身上发出的红外线&#xff0c;输出开关信号&#xff0c;可以应用于各种需要检测运动人体的场合。传统的热释电红外传感器需要人体热释电红外探头、专…

C++基础语法——unordered_map和unordered_set

1. unordered系列关联式容器 在C98中&#xff0c;STL提供了底层为红黑树结构的一系列关联式容器&#xff0c;在查询时效率可达到log(N)&#xff0c;即最差情况下需要比较红黑树的高度次&#xff0c;当树中的节点非常多时&#xff0c;查询效率也不理想。最好的查询是&#xff0c…

【16】c++设计模式——>建造者(生成器)模式

什么是建造者模式? 建造者模式&#xff08;Builder Pattern&#xff09;是一种创建型设计模式&#xff0c;它允许你构造复杂对象步骤分解。你可以不同的步骤中使用不同的方式创建对象&#xff0c;且对象的创建与表示是分离的。这样&#xff0c;同样的构建过程可以创建不同的表…

python pygame入门 - 安装测试篇

pygame入门 - 安装篇 引言一、安装测试1.1 创建虚拟环境1.2 安装测试pygame 二、查看例程源码2.1 源码位置2.2 简单修改 引言 pygame是Python语言特别为游戏开发而设计的一个开源库。它提供了一系列模块和函数&#xff0c;可以帮助开发者快速构建2D游戏、多媒体应用程序和其他…

Electronjs入门-Electron中的主要模块

在本节中&#xff0c;我们将了解在Electron中创建任何应用程序时的一些基本模块&#xff1b;这些模块多种多样&#xff0c;使我们能够轻松地进行进程通信&#xff0c;创建操作系统的本地菜单。 为了利用Electron模块&#xff0c;以及任何第三方或Node模块&#xff0c;不仅在主流…