C++primer(第五版)第十四章(重载运算与类型转换)

news2024/11/16 0:01:23

14.1基本概念 

重载运算符和重载其他函数差不多,运算符有多少参数,那么重载运算符就有多少参数.不同的是重载运算符有名字方面的限制,是operator加上运算符号.且除了函数调用运算符()之外,不允许有默认实参.

 以上其中逻辑与运算符,逻辑或运算符,逗号运算符,取地址运算符不推荐重载.

并且重载时尽量与内置的运算符含义一致.(不要把加号重置成减法)

当我们把重载运算符定义为成员函数时时,左侧的运算对象必须是运算符所属的一个对象.

我这边定义一个简单的类,有两个成员函数,接下来演示重载运算符都按照这个类.

class Student {
public:
	int age;
	string name;
	Student(int a, string n) :age(a),name(n){}
};

14.2输入和输出运算符

输入输出运算符必须是非成员函数.

14.2.1重载输出运算符<<

一般情况下,输出运算符的第一个形参是非常量的ostream对象的引用.非常量是因为可能会改变ostream的状态.引用是因为我们无法拷贝ostream对象.第二个形参通常是常量的引用.为了和其他输出运算符保持一致(也为了链式编程),要返回ostream形参.

//定义在Student类外
ostream& operator<<(ostream& cout,const Student& s) {
	cout << s.name << ' ' << s.age;
	return cout;
}

通常重载输出运算符为了打印类的信息更加便利.若需打印类的私有成员,则需将IO运算符声明为友元.

14.2.2重载输入运算符>>

和重载输入运算符差不多,但是输入运算符需要处理输入可能失败的情况.

14.3算术和关系运算符

如果同时定义了算术运算符和相关的符合赋值运算符(例如+和+=),则通常情况下应该使用复合赋值来实现算术运算符.

14.3.1相等运算符

以下例子为定义若两个Student类的对象的年龄一致则返回true.定义与Student类外.

bool operator==(const Student& s1, const Student& s2) {
	return s1.age == s2.age;
}

14.3.2关系运算符

和上面的相等运算符差不多,只不多定义的是<,>,<=,>=.需要注意的是定义好统一的排序顺序.值得一提的是,如果map的键类型为自定义类型,那么必须定义好关系运算符,因为map自动按照键值来升序排列,没有定义好类的排列顺序则会出问题.

14.4赋值运算符

这个在上一章有介绍,就是移动赋值运算符.

14.5下标运算符

必须是类的成员函数.

为了和原始的定义兼容,通常返回所访问的元素的引用作为返回值.

14.6递增和递减运算符

不是必须但是建议是类的成员函数.

为了区分前置和后置运算符,在后置版本的参数列表中添加一个不被使用的形参.并且后置模式为了和内置的版本保持一致,需要在数值加一之前先保存住原值,然后加一之后再将原值返回出去.

//前置版本递增运算符        
Student operator++() {
	this->age += 1;
	return *this;
}
//后置版本递减运算符
Student operator++(int) {
	Student temp = *this;
	this->age += 1;
	return temp;
}

除了正常使用递增递减符号之外,也可以显式地使用(将其当作函数).

Student s1(18, "张三");
s1.operator++();    //调用前置版本
s1.operator++(0);   //调用后置版本,其中0无实意,只要和前面定义的形参类型一致即可

14.7成员访问运算符

箭头运算符必须是类的成员.

解引用非必要但是建议为类的成员.

(但我不是很理解为什么要重载这类运算符)

14.8函数调用运算符

如果一个类定义了调用运算符(),那么该类的对象称为函数对象(仿函数).因为可以把类的对象当作函数名来使用.

例如我在开头定义的类内加上:

	void operator() (){
		cout << "my name is " << this->name << endl;
	}

然后可以像调用函数一样使用Student的对象. 

14.8.1 lambda是函数对象

重载了函数调用符后,可以用类来代替lambd.

例如在使用sort算法时,第三个参数可以写上类名加上().

14.8.2标准库定义的函数对象

通常和STL的算法配套使用.

英文好的应该一看名字就知道是这么用的了,这里不多介绍.

14.8.3可调用对象与function

C++中可调用对象有:函数,函数指针,lambda表达式,bind创建的对象,重载了函数调用运算符的类.

两个不同类型的可调用函数可以共享一种调用形式.调用形式指明了返回的类型以及传递给调用的实参类型.

int<int,int>

 上面这个是一个函数类型,表示为接收两个int的参数,返回值为int.

我们可以使用定义在functional头文件中的function来表达函数类型.

 14.9重载,类型转换与运算符

类型转换运算符是类的一种特殊成员函数,它负责将一个类类型的值转换成其他类型,形式如下:

 operator type() const;

应当避免过度使用类型转换函数.

并且应当避免有二义性的类型转换.

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

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

相关文章

多元分类预测 | Matlab偏小二乘PLS分类预测,多特征输入模型

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 多元分类预测 | Matlab偏小二乘PLS分类预测,多特征输入模型 多特征输入单输出的二分类及多分类模型。程序内注释详细,直接替换数据就可以用。程序语言为matlab,程序可出分类效果图,迭代优化图,混淆矩阵图。 部…

AutoHotkey配置鼠标光标在双屏幕之间瞬移

双屏幕带来的问题 使用双屏幕会带来两个问题&#xff1a;一个是窗口的切换移动不方便&#xff0c;另一个是鼠标的切换移动不方便。 如果需要将屏幕 A 的窗口快速移动到屏幕 B&#xff0c;可以用过 win shift 左右键来实现。 但是令人头疼的一个问题是鼠标还停留在屏幕 A&a…

Python 识别某验消消乐验证码

某验的消消乐验证码识别就很简单了,在一个九宫格里,找出相邻的两个元素交换后,保证有一行或者一列的元素相同,如下图: 如果这一个九宫格是一张图片的话,我们将其分割成9个部分,然后每一格都将其标注为一个类别就行,或者直接从源码中拿到9张图片,最终的话,是转成一个…

Devops系列六(CI篇之jenkinsfile)jenkins将gitlab helm yaml和argocd 串联,自动部署到K8S

一、为什么是jenkinsfile 上文我们说了pipeline&#xff0c;已为本文铺路不少&#xff0c;接下里就是将之串联起来。 先想说下&#xff0c;为什么是jenkinsfile, 因为jenkins job还支持pipeline方式。 这种方式&#xff0c;不建议实际使用&#xff0c;仅限于测试或调试groovy…

2 第一个springboot程序

2.1 创建springboot项目 有两种方法&#xff1a;一种是从官网上下载jar包&#xff0c;然后使用idea的import导入。另一种是直接在idea创建springboot项目。 2.1.1 方法一 进入spring官网&#xff08;Spring | Home&#xff09;。 点击projects的spring boot。 点击overview。 …

【java】空字符串“”和null区别,以及判空的方案

空字符串“” 1、类型&#xff1a;“”是一个空字符串&#xff08;String&#xff09;&#xff0c;长度为0&#xff0c;占内存&#xff0c;在内存中分配一个空间&#xff0c;可以使用Object对象中的方法。&#xff08;例如&#xff1a;“”.toString()等&#xff09; 2、内存分…

【Distributed】分布式监控系统zabbix应用(一)

文章目录 前言一、Zabbix基本概述1. Zabbix 的概念2. Zabbix 的工作原理3. Zabbix 6.0 新特性3.1 Zabbix 可以实现高可用3.2 Zabbix 新增监控系统 4. Zabbix 的构成5. Zabbix 的功能组件5.1 数据库5.2 Web 界面5.3 Zabbix Agent5.4 Zabbix Proxy5.5 Java Gateway 6. Zabbix 和 …

【JavaWeb】了解JavaScript DOM API

目录 1、什么是DOM 1.1、DOM树 1.2、 了解事件 2、常用的DOM API 2.1、选中页面元素 2.2、获取/修改元素内容 2.2.1、innerHTML和innerText 2.2、获取/修改元素属性 2.3、获取/修改表单元素属性 3、JQuery框架的简单了解和使用 4、代码案例&#xff1a;实现聚合索引功…

python 常用数据结构-元祖

Tuple 元组 元组定义与使用元组常用方法元组与列表 元组定义 元组是有序的不可变对象集合元组使用小括号包围&#xff0c;各个对象之间使用逗号分隔定义元祖可以不用括号&#xff0c;直接使用,隔开元组是异构的&#xff0c;可以包含多种数据类型 元组使用&#xff1a;创建 …

解决Unity的PostProcess奇怪报错

大家好&#xff0c;我是阿赵。   最近在使用Unity的PostProcess后处理效果的时候&#xff0c;发现了一个问题&#xff0c;下面记录一下这个问题的出现原因和解决办法。 一、出现问题 问题是这样出现的&#xff1a;   在场景里面添加某一个后处理效果后&#xff0c;当这个后…

JUC之ThreadLocal

文章目录 1 基础知识1.1 强软弱虚四种引用 2 ThreadLocal出现的好处3 ThreadLocal源码分析3.1 ThreadLocal内存泄露问题3.2 ThreadLocal为什么使用的是弱引用3.3 清扫过期的Entry 4 ThreadLocal使用建议 1 基础知识 1.1 强软弱虚四种引用 【整体结构】 【强引用】 【软引用…

(文件[夹]批量分类整理_多级匹配_交叉匹配_路径结构交叉调整)文件[夹]批量复制

​ 首先&#xff0c;需要用到的这个工具&#xff1a; 百度 密码&#xff1a;qwu2 蓝奏云 密码&#xff1a;2r1z ​如果没有使用过此工具&#xff0c;建议阅读此教程前&#xff0c;先看下这篇文章&#xff1a;https://mp.csdn.net/mp_blog/creation/editor/113605549 原理&…

【Python爬虫与数据分析】文件读写

目录 一、概述 二、txt文件读写 三、csv文件读写 四、Json文件读写 一、概述 读写模式&#xff1a; r&#xff1a;读数据w&#xff1a;覆盖写入a&#xff1a;追加写入rb&#xff1a;以二进制形式读出wb&#xff1a;以二进制形式写入ab&#xff1a;以二进制形式追加r、w、…

Java log 日志

文章目录 log4j.properties配置 log4j.properties 配置 log4j.rootLoggerINFO, stdoutlog4j.appender.stdoutorg.apache.log4j.ConsoleAppender log4j.appender.stdout.layoutorg.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern%d{yyyy-MM-dd H…

MySQL单表查询练习题

目录 第一题 第二题 第三题 第一题 1.创建数据表pet&#xff0c;并对表进行插入、更新与删除操作&#xff0c;pet表结构如表8.3所示。 (1&#xff09;首先创建数据表pet&#xff0c;使用不同的方法将表8.4中的记录插入到pet表中。 mysql> create table pet( name varchar(…

网络安全(黑客)内网渗透基础知识

0x01 内网概述 内网也指局域网&#xff08;Local Area Network&#xff0c;LAN&#xff09;是指在某一区域内由多台计算机互联成的计算机组。一般是方圆几千米以内。局域网可以实现文件管理、应用软件共享、打印机共享、工作组内的历程安排、电子邮件和传真通信服务等功能。 内…

交叉导轨的结构与特长

在交叉导轨中&#xff0c;精密滚柱互相直交地组合在一起的滚柱保持架与设置在专用轨道上的90V形沟槽滚动面组合起来使用。通过将2列滚子导轨平行地装配&#xff0c;使导轨系统能承受4个方向的负荷。而且&#xff0c;因能向交叉滚子导轨施加预压&#xff0c;从而能获得无间隙且高…

zookeeper单机安装

1 检查环境jdk 参考&#xff1a;https://blog.csdn.net/weixin_44098426/article/details/128446376 2 解压安装包 mkdir -p /opt/zookeeper mv /home/wh/software/zk/apache-zookeeper-3.5.7-bin.tar.gz /opt/zookeeper tar -xzvf apache-zookeeper-3.5.7-bin.tar.gz 3 配置…

在Windows环境下安装Elasticsearch 8.8.2

Elasticsearch是一种开源的分布式搜索和分析引擎&#xff0c;被广泛应用于构建实时搜索、日志分析、数据可视化等应用。本文将详细介绍如何在Windows环境下安装和配置Elasticsearch 8。 安装Elasticsearch 步骤1&#xff1a;准备工作 在开始安装之前&#xff0c;确保已满足以…

多元回归预测 | Matlab灰狼算法(GWO)优化极限梯度提升树XGBoost回归预测,GWO-XGBoost回归预测模型,多变量输入模型

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 多元回归预测 | Matlab灰狼算法(GWO)优化极限梯度提升树XGBoost回归预测,GWO-XGBoost回归预测模型,多变量输入模型 评价指标包括:MAE、RMSE和R2等,代码质量极高,方便学习和替换数据。要求2018版本及以上。 部分源…