【C++】运算符重载 一

2023-11-07

C++ 允许在同一作用域中的某个函数运算符指定多个定义,分别称为函数重载运算符重载。重载声明是指一个与之前已经在该作用域内声明过的函数或方法具有相同名称的声明,但是它们的参数列表和定义(实现)不相同。当您调用一个重载函数重载运算符时,编译器通过把您所使用的参数类型与定义中的参数类型进行比较,决定选用最合适的定义。选择最合适的重载函数或重载运算符的过程,称为重载决策。 


您可以重定义或重载大部分 C++ 内置的运算符。这样,您就能使用自定义类型的运算符。重载的运算符是带有特殊名称的函数,函数名是由关键字 operator 和其后要重载的运算符符号构成的。与其他函数一样,重载运算符有一个返回类型和一个参数列表。

Box operator+(const Box&);

声明加法运算符用于把两个 Box 对象相加,返回最终的 Box 对象。大多数的重载运算符可被定义为普通的非成员函数或者被定义为类成员函数。如果我们定义上面的函数为类的非成员函数,那么我们需要为每次操作传递两个参数,如下所示:

Box operator+(const Box&, const Box&);

下面的实例使用成员函数演示了运算符重载的概念。在这里,对象作为参数进行传递,对象的属性使用 this 运算符进行访问,如下所示:

#include <iostream>
using namespace std;

class Box
{
public:

	double getVolume(void)
	{
		return length * breadth * height;
	}
	void setLength(double len)
	{
		length = len;
	}
	void setBreadth(double bre)
	{
		breadth = bre;
	}
	void setHeight(double hei)
	{
		height = hei;
	}

	// 重载 + 运算符,用于把两个 Box 对象相加
	Box operator+(const Box& b)
	{
		Box box;
		box.length = this->length + b.length;
		box.breadth = this->breadth + b.breadth;
		box.height = this->height + b.height;
		return box;
	}

private:
	double length;      // 长度
	double breadth;     // 宽度
	double height;      // 高度
};

// 程序的主函数
int main()
{
	Box Box1;                // 声明 Box1,类型为 Box
	Box Box2;                // 声明 Box2,类型为 Box
	Box Box3;                // 声明 Box3,类型为 Box
	double volume = 0.0;     // 把体积存储在该变量中

	// Box1 详述
	Box1.setLength(6.0);
	Box1.setBreadth(7.0);
	Box1.setHeight(5.0);
	// Box2 详述
	Box2.setLength(12.0);
	Box2.setBreadth(13.0);
	Box2.setHeight(10.0);

	// Box1 的体积
	volume = Box1.getVolume();
	cout << "Volume of Box1 : " << volume << endl;
	// Box2 的体积
	volume = Box2.getVolume();
	cout << "Volume of Box2 : " << volume << endl;
	
	// 把两个对象相加,得到 Box3
	Box3 = Box1 + Box2;
	// Box3 的体积
	volume = Box3.getVolume();
	cout << "Volume of Box3 : " << volume << endl;

	return 0;
}

--------------------------------------------------------------
Volume of Box1 : 210
Volume of Box2 : 1560
Volume of Box3 : 5400
请按任意键继续. . .

    // 把两个对象相加,得到 Box3
    Box3 = Box1 + Box2;

在这一行语句中,Box1是该运算符的主导,成员函数中的This指的也是Box1。当然这个和运算符重载函数的参数形式有关。


可重载运算符/不可重载运算符

下面是可重载的运算符列表:

双目算术运算符 + (加),-(减),*(乘),/(除),% (取模)
关系运算符 ==(等于),!= (不等于),< (小于),> (大于>,<=(小于等于),>=(大于等于)
逻辑运算符 ||(逻辑或),&&(逻辑与),!(逻辑非)
单目运算符 + (正),-(负),*(指针),&(取地址)
自增自减运算符 ++(自增),--(自减)
位运算符 | (按位或),& (按位与),~(按位取反),^(按位异或),,<< (左移),>>(右移)
赋值运算符 =, +=, -=, *=, /= , % = , &=, |=, ^=, <<=, >>=
空间申请与释放 new, delete, new[ ] , delete[]
其他运算符 ()(函数调用),->(成员访问),,(逗号),[](下标)

下面是不可重载的运算符列表:

  • .:成员访问运算符
  • .*, ->*:成员指针访问运算符
  • :::域运算符
  • sizeof:长度运算符
  • ?::条件运算符
  • #: 预处理符号

参考来源:C++ 重载运算符和重载函数

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【C++】运算符重载 一 的相关文章

  • 【C++】Lambda表达式

    C 11的一大亮点就是引入了Lambda表达式 利用Lambda表达式 可以方便的定义和创建匿名函数 对于C 这门语言来说来说 Lambda表达式 或 匿名函数 这些概念听起来好像很深奥 但很多高级语言在很早以前就已经提供了Lambda表达
  • 【C++】volatile关键字

    我们都知道当使用编译器时候 编译器会为我们的代码做出一些优化 关于validate关键字的功能和原理我们将用一个例子来给出解释 功能 当一个变量被volidate关键字修饰时 意味着当我们每次使用这个变量时都会从变量所在的内存中去获取 而不
  • 【C++】异常处理

    一 什么是异常处理 一句话 异常处理就是处理程序中的错误 二 为什么需要异常处理 以及异常处理的基本思想 C 之父Bjarne Stroustrup在 The C Programming Language 中讲到 一个库的作者可以检测出发生
  • c++类模板与继承

    继承中父子类和模板类的结合情况 1 父类是一般类 子类是模板 类 2 父类是模板类 子类是一般类 3 父类和子类都是模板类 1 include
  • C++之函数重载

    目录 1 函数重载 2 函数重载的概念 3 编译器的工作 4 判断函数重载的规则 1 函数的重复声明 2 参数表的比较过程与形参名无关 3 如果在两个函数的参数表中 4 相同的参数列表 5 形参是按值传递方式定义 6 参定义指针或引用 7
  • STL源码:lis容器(Qt5.8版本)

    初次学习STL源码 很多语义尚且比较模糊 需待二次学习 源文件结构 主要的实现都在
  • 【C++笔记】C++11常用特性的使用经验总结

    转载 https www cnblogs com feng sc p 5710724 html title12
  • C++的一些概念 面向对象程序的基本特点

    本节主要介绍一些基本概念 有关于面向对象程序的基本特点 Markdown和扩展Markdown简洁的语法 抽象 对某一类对象的共同属性和行为进行概括 形成类 首先注意问题的本质和描述 其次是实现的过程或细节 数据抽象 描述某类对象的属性或状
  • 【C++笔记】数据结构栈、堆,内存占用中栈区、堆区的区别和理解

    在计算机领域 堆栈是一个不容忽视的概念 我们编写的C语言程序基本上都要用到 但对于很多的初学着来说 堆栈是一个很模糊的概念 堆栈 一种数据结构 一个在程序运行时用于存放的地方 这可能是很多初学者的认识 因为我曾经就是这么想的和汇编语言中的堆
  • C++初探 5-1(for循环)

    目录 注 for循环 for循环的组成部分 1 表达式和语句 2 非表达式和语句 3 修改规则 for循环的使用例 阶乘的计算与存储 修改循环更新的步长 使用for循环访问字符串 递增运算符 和 递减运算符 副作用和顺序点 前缀格式和后缀格
  • C#输入输出

    目录 一 函数介绍 二 C 中输入输出的一些例子 一 函数介绍 C Console 类主要用于控制台应用程序的输入和输岀操作 Console Read 和Console ReadLine 的区别在于 前者读取是根据空白符隔开且返回int类型
  • 数据结构与算法--分治策略

    目录 1 分治概念 2 递归的概念递归 3 分治策略的 1 分治策略的特征 2 分治法步骤 4 栈的面试题 5 示例 1 示例1求解n的阶乘 1 分析 2 阶乘可递归的定义为 3 递归程序 4 图解递归过程 代码的调动过程 5 图解递归过程
  • C# new与malloc

    目录 C new与malloc C new与malloc的区别 C new关键字底层做的操作 C new与malloc new关键字 new关键字在C 中用于实例化对象 并为其分配内存 它是面向对象编程的基本操作之一 使用new关键字可以在
  • 【C++ 并发与多线程】std::thread类-为共享数据加锁 2

    正交 消除无关事务之间的影响 力求高内聚低耦合 死锁的概念略去不说 死锁有可能发生在使用多个互斥量的场景下 也可能存在没有使用互斥量的场景 两个线程都在等待对方释放互斥量 两个线程都调用了对方的join 函数 为了解决两个线程都在等待对方释
  • C语言用牛顿迭代法和二分法递归求解三元一次方程

    求解方程 2x 3 4x 2 3x 6 0 牛顿迭代法 牛顿迭代法公式 以下图片均来源于百度 牛顿迭代法用递归实现解三元一次方程 include
  • C语言--swap交换函数

    目录 1 swap1 int a int b 不变 2 swap2 int a int b 不变 3 swap3 int a int b 改变 4 swap4 int a b 改变 1 swap1 int a int b 不变 void s
  • C++面试题之继承

    目录 设计一个类型 不能在外部环境中创建该类的对象 设计一个不能被继承的类 设计一个不能被继承的类 但可以在外部环境创建该类型的对象 设计一个能被继承的类 但不能在外部环境创建该类型的对象 限制派生类对象不可以拷贝和赋值如何实现 设计一个类
  • 函数重载 隐藏 重写 覆盖

    重载 Overload 重载是比较容易弄明白的 定义 重载是指不同的函数使用相同的函数名 但是函数的参数个数或类型不同 参数列表不同 调用的时候根据函数的参数来区别不同的函数 函数重载跟返回值无关 规则 函数名相同 必须具有不同的参数列表
  • 【C语言】进制输出加上前缀

    对于八进制数字 它没法和十进制 十六进制区分 因为八进制 十进制和十六进制都包含 0 7 这几个数字 对于十进制数字 它没法和十六进制区分 因为十六进制也包含 0 9 这几个数字 如果十进制数字中还不包含 8 和 9 那么也不能和八进制区分
  • 二叉树的根到叶子几点之和

    输入 root 1 2 3 输出 25 解释 从根到叶子节点路径 1 gt 2 代表数字 12 从根到叶子节点路径 1 gt 3 代表数字 13 因此 数字总和 12 13 25 输入 root 1 0 1 0 1 0 1 输出 22 解释

随机推荐

  • electron 应用优雅的配置 about 信息

    使用 electron 的 dialog tray 托盘栏菜单优雅简单的配置 about 关于本应用的信息 效果下图所示 项目依赖 electron 24 4 1 electron builder 23 6 0 electron build
  • 库默尔定理学习小记

    A组又出现了逆天的数竞定理 随便口胡一下 定理 有两个正整数n m p是质数 Cnn m C n m n含 的幂次等于 在 进制下的进位数 简略证明 Cnn m C n m n含 的幂次 i 1 n mpi i 1 npi i 1 mpi
  • Oracle入门笔记(九)——视图、序列、索引、同义词和权限等

    视图和索引 1 视图 2 序列 3 索引 4 同义词 5 数据控制语言 DCL 6 执行计划 1 视图 视图是 基于数据表或者另外一个视图的逻辑表 类似于一个数据表或者数据表间组合之后得到的数据窗口 通过窗口能够查看数据表或者表间组合时候得
  • ELK 企业级日志分析系统(理论加实战部署详解)

    ELK 企业级日志分析系统 理论加实战部署详解 文章目录 一 ELK 概述 1 1 ELK 的工作原理 二 部署详解 一 ELK Elasticsearch 集群部署 在Node1 Node2节点上操作 二 ELK Logstash 部署
  • 【搜索引擎Solr】配置 Solr 以获得最佳性能

    Apache Solr 是广泛使用的搜索引擎 有几个著名的平台使用 Solr Netflix 和 Instagram 是其中的一些名称 我们在 tajawal 的应用程序中一直使用 Solr 和 ElasticSearch 在这篇文章中 我
  • 手撕代码:统计1到n二进制数中1出现的总次数

    题目描述 互娱手撕代码题 统计从1到n这n个数的二进制表示中1出现的次数 思路分析 思路一 直接的做法是从1遍历到n 对于每个数和1做与操作 之后 对于这个数不断做右移操作 不断和1做与操作 直到当前数为0 这样的算法复杂度为O nlogn
  • C++ 播放音频流(PCM裸流)

    直接上代码 如果有需要可以直接建一个win32控制台程序然后将代码拷过去改个文件名就可以用了 注意将声道和频率与你自己的文件对应 当然我自己也用VS2008写了个例子上传了 如果有需要下载地址如下 点击打开链接 这份代码是打开文件截取一段数
  • vue-amap 高德地图定位 点击获取经纬度和具体地址的使用

    官方文档地址 点这里 经纬度获取只要通过点击事件就可以通过e lnglat来获取 然后就是插件Geocoder使用了 在main js中initAMapApiLoader中写入 AMap Geocoder 注意 官方文档中有提示 所以插件中
  • webpack5 (三)

    webpack 高级配置 其实就是对 webpack 进行优化 让代码在编译 运行时性能更好 1 提升开发体验 2 提升打包构建速度 3 减少代码体积 4 优化代码运行性能 一 提升开发体验 sourcemap 在编译打包后所有的 css
  • 图片无损放大软件Topaz Gigapixel AI 5.5.2 win mac 汉化 mac只有英文版

    Topaz Gigapixel AI 5 5 2 win mac 汉化版 mac只有英文版 今天给大家带来一款超级强大的无损放大图片软件 在放大的同时还能够为你优化图片 真的不要太棒 这个软件的名字叫 Topaz Gigapixel AI
  • 【深度学习】卷积神经网络之图像分类|CNN、AlexNet、VGG、GoogLeNet、ResNet

    一 CNN 卷积神经网络分为卷积层 池化层 全连接层 softmax层 卷积层 卷积核与输入层中的一个区域相连 计算内积后加上权重 激活函数层 激活函数层包括在卷积层中 将相连的神经元进行激活 通常使用ReLu激活函数 m a x 0
  • 什么是元宇宙数字人,它距离我们还有多远呢?

    近期 元宇宙数字人 成为全球热议的焦点 众多资本方争相进入 使得互联网正在迎来转型为 元宇宙 的窗口期 究竟什么是 元宇宙数字人 它距离我们还有多远呢 元宇宙 最早是由是由科幻作家尼尔 斯蒂芬森于1992年在其著作 雪崩 中提出原始概念 元
  • list用Stream通过实体类的指定字段去重,排序

    public void testSelect List
  • 二叉树的前序,中序,后序,层序遍历实现(递归,迭代两种方式)

    先定义Node节点对象 public class Node public int value public Node left public Node right public Node int value Node left Node r
  • Qt - 菜单栏、工具栏、状态栏(自定义菜单)

    菜单栏 工具栏 状态栏 主窗口框架拥有自己的布局 包括以下组件 菜单栏 菜单栏包含了一个下拉菜单项的列表 这些菜单项通过QAction动作类实现 一个主窗口只能有一个菜单栏 工具栏 工具栏一般用于显示常用的菜单项 也可插入其他窗口部件 一个
  • 小程序授权登录流程详情步骤

    样式展示实例 这个原理是 我们开发的软件 调用微信app弹框 这个框主要是获取当前微信登录的用户的信息 允许 取消 允许就是允许我们开发的软件 获取微信的登录的用户信息 通俗 获取微信用户的信息去登录 不允许 通俗 不允许获取微信用户的信息
  • java学习-批量查看多个文件夹下多个xls格式的excel文件

    windows下目录展示执行命令 dir B S E rs 2017 E rs 2018 E rs 2019 E rs 2017 已支付 201701 xls E rs 2017 已支付 201702 xls E rs 2017 已支付 2
  • Consul(注册中心)部署

    目录 前言 一 Docker consul 注册中心 1 什么是consul 2 consul干什么 3 常见的注册中心 4 Consul 特性 5 Consul的使用场景 6 Consul的基本架构 二 consul集群 1 server
  • #include errors detected.Please update your includePath...或者 cannot open source file...

    本文主要介绍一种使用vscode解决include头文件时常遇到的一个问题的一种快捷解决方式 在写C 程序时经常会碰到这样的问题 就是 include lt gt 下方有个条红色的波浪线 你将鼠标挪过去 然后编辑器提示你 include e
  • 【C++】运算符重载 一

    C 允许在同一作用域中的某个函数和运算符指定多个定义 分别称为函数重载和运算符重载 重载声明是指一个与之前已经在该作用域内声明过的函数或方法具有相同名称的声明 但是它们的参数列表和定义 实现 不相同 当您调用一个重载函数或重载运算符时 编译