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

文章目录

  • 一、左移运算符重载
    • 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.hqwc.cn/news/126045.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Llama2-Chinese项目:8-TRL资料整理

TRL&#xff08;Transformer Reinforcement Learning&#xff09;是一个使用强化学习来训练Transformer语言模型和Stable Diffusion模型的Python类库工具集&#xff0c;听上去很抽象&#xff0c;但如果说主要是做SFT&#xff08;Supervised Fine-tuning&#xff09;、RM&#x…

Python脚本实现xss攻击

实验环境&#xff1a;zd靶场、vscode 知识点 requests.session() 首先我们需要先利用python requests模块进行登录&#xff0c;然后利用开启session记录&#xff0c;保持之后的操作处于同一会话当中 requests.session()用于创建一个会话(session)的实例对象。使用requests库…

【JavaEE】多线程进阶(一)饿汉模式和懒汉模式

多线程进阶&#xff08;一&#xff09; 文章目录 多线程进阶&#xff08;一&#xff09;单例模式饿汉模式懒汉模式 本篇主要引入多线程进阶的单例模式&#xff0c;为后面的大冰山做铺垫 代码案例介绍 单例模式 非常经典的设计模式 啥是设计模式 设计模式好比象棋中的 “棋谱”…

Python无废话-办公自动化Excel格式美化

设置字体 在使用openpyxl 处理excel 设置格式&#xff0c;需要导入Font类&#xff0c;设置Font初始化参数&#xff0c;常见参数如下&#xff1a; 关键字参数 数据类型 描述 name 字符串 字体名称&#xff0c;如Calibri或Times New Roman size 整型 大小点数 bold …

做外贸独立站选Shopify还是WordPress?

现在确实会有很多新人想做独立站&#xff0c;毕竟跨境电商平台内卷严重&#xff0c;平台规则限制不断升级&#xff0c;脱离平台“绑架”布局独立站&#xff0c;才能获得更多流量、订单、塑造品牌价值。然而&#xff0c;在选择建立外贸独立站的过程中&#xff0c;选择适合的建站…

TinyWebServer整体流程

从main主函数开始&#xff1a; 一、定义MySQL数据库的账号、密码和用到的数据库名称。 二、调用Config获得服务器初始化属性 在这一步确定触发模式端口等信息。 三、创建服务器实例对象 设置根目录、开辟存放http连接对象的空间&#xff0c;开辟定时器空间。 四、利用Confi…

《视觉 SLAM 十四讲》V2 第 5 讲 相机与图像

文章目录 相机 内参 && 外参5.1.2 畸变模型单目相机的成像过程5.1.3 双目相机模型5.1.4 RGB-D 相机模型 实践5.3.1 OpenCV 基础操作 【Code】OpenCV版本查看 5.3.2 图像去畸变 【Code】5.4.1 双目视觉 视差图 点云 【Code】5.4.2 RGB-D 点云 拼合成 地图【Code】 习题题…

Clion中使用C/C++开发stm32程序

前言 从刚开始学习阶段&#xff0c;一直是用的keil5开发stm32程序&#xff0c;自从看到稚晖君推荐的CLion开发嵌入式程序后&#xff0c;这次尝试在CLion上开发stm32程序。 1、配置CLion用于STM32开发的环境 这里我就不详细写了&#xff0c;没必要重新写&#xff0c;网上教程很多…

Http常见问题

说说 HTTP 常用的状态码及其含义&#xff1f; HTTP 状态码首先应该知道个大概的分类&#xff1a; 1XX&#xff1a;信息性状态码2XX&#xff1a;成功状态码3XX&#xff1a;重定向状态码4XX&#xff1a;客户端错误状态码5XX&#xff1a;服务端错误状态码 301&#xff1a;永久性…

突破封锁|华为芯片10年进化史:从K3V1到麒麟9000S

华为海思麒麟芯片过去10年研发历程回顾如下&#xff1a; 2009年&#xff1a;华为推出第一款手机芯片K3V1&#xff0c;采用65nm工艺制程&#xff0c;基于ARM11架构&#xff0c;主频600MHz&#xff0c;支持WCDMA/GSM双模网络。这款芯片搭载在华为U8800手机上&#xff0c;标志着华…

伟大不能被计划

假期清理书单&#xff0c;把这个书读完了&#xff0c;结果发现出奇的好&#xff0c;可以说是值得亲身去读的书&#xff0c;中间的一些论述提供了人工智能专业方面的视角来论证这这个通识观点&#xff0c;可信度很不错&#xff1b; 这篇blog也不是对书的总结&#xff0c;更多的是…

CSS小计

1&#xff1a;设置图片随窗缩放 使用百分比 width: 100%;height: 100%; 使用vmin: 将可视区域分为100vmin width: 100vmin;height: 100vmin; 2:设置字体颜色与背景色融合 mix-blend-mode: difference 3: 设置宽度自适应 width:fit-content 4:外边距合并 当两个相领的两个容…