news 2026/1/25 11:43:31

1.运算符重载

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
1.运算符重载

1.运算符重载

函数重载,函数们在执行相同的操作,但是操作的对象的数据类型不同。

运算符重载允许赋予C++运算符多种含义。C++根据操作数的数目和类型来决定采用哪种操作。

例如:两个数组相加

正常来说要:

for(ing i = 0; i < 20; i++) { sum[i] = a[i] + b[i]; }

通过重载+,可以这样写:

sum = a + b;

.

重载:

.

operatorop(argument-list)//op必须是有效的C++运算符

,

operator+()//重载+运算符

eg:

假设有一个 Salesperson 类,并为它定义了一个operator+()成员函数,以重载+运算符,以便能够将两个 Saleperson 对象的销售额相加,则如果 district2、sid 和 sara 都是 Salesperson 类对象,便可以编写这样的等式:

district2 = sid + sara;

编译器发现,操作数是 Salesperson类对象,因此使用相应的运算符函数替换上述运算符:

district2 = sid.operator+(sara);//此处operator+()是一个成员函数

注:函数的返回值不要指向局部变量或临时对象的引用。因为函数执行完毕后,局部变量和临时对象将消失,引用将指向不存在的数据。

未使用运算符重载:

mytime0.h

#pragma once #ifndef __MYTIME0__H__ #define __MYTIME0__H__ ​ class mytime0 { private: int hours; int minutes; public: mytime0(); // 默认构造函数 mytime0(int h, int m = 0); // 带参数的构造函数 void add_min(int m); // 增加分钟 void add_hr(int h); // 增加小时 void reset(int h = 0, int m = 0); // 重置时间 mytime0 sum(const mytime0& mt) const; // 求和函数 void show() const; // 显示时间 }; ​ #endif // !__MYTIME0__H__ ​ ​ ​ ​

.

mytime0.cpp

#include "mytime0.h" #include <iostream> using namespace std; ​ ​ mytime0::mytime0() { hours = minutes = 0; // 默认构造函数初始化小时和分钟为0 } ​ mytime0::mytime0(int h, int m) { hours = h; // 设置小时 minutes = m; // 设置分钟 } ​ void mytime0::add_min(int m) { minutes += m; // 增加分钟 if (minutes >= 60) // 如果分钟超过60,转换为小时 { hours += minutes / 60; // 将分钟转换为小时 minutes %= 60; // 更新分钟 } } ​ void mytime0::add_hr(int h) { hours += h; // 增加小时 } ​ void mytime0::reset(int h, int m) { hours = h; // 重置小时 minutes = m; // 重置分钟 if (minutes >= 60) // 如果分钟超过60,转换为小时 { hours += minutes / 60; // 将分钟转换为小时 minutes %= 60; // 更新分钟 } } ​ /*然而,返回值不能是引用。因为函数将创建一个新的Time对象(sum),来表示另外两个 Time 对象的和。 *返回对象(如代码所做的那样)将创建对象的副本,而调用函数可以使用它。 *然而,如果返回类型为Time&,则引用的将是 sum 对象。 *但由于 sum 对象是局部变量,在函数结束时将被删除,因此引用将指向一个不存在的对象。 *使用返回类型 Time 意味着程序将在删除sum 之前构造它的拷贝,调用函数将得到该拷贝。 */ mytime0 mytime0::sum(const mytime0& mt) const { mytime0 temp; // 创建一个临时mytime0对象 temp.hours = hours + mt.hours; // 将当前对象的小时和传入对象的小时相加 temp.minutes = minutes + mt.minutes; // 将当前对象的分钟和传入对象的分钟相加 if (temp.minutes >= 60) // 如果分钟超过60,转换为小时 { temp.hours += temp.minutes / 60; // 将分钟转换为小时 temp.minutes %= 60; // 更新分钟 } return temp; // 返回结果(不能返回指针和引用,因为函数的返回值在函数运行结束的那一刻就释放了,如果返回指针或者引用的话指向的就是不存在的东西) } ​ void mytime0::show() const { cout << hours << " hours, " << minutes << " minutes" << endl; // 显示时间 }

.

project2.cpp

// project2.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 // ​ #include <iostream> #include "mytime0.h" int main() { std::cout << "Hello World!\n"; mytime0 t1 = mytime0(1, 36); mytime0 t2 = mytime0(2, 45); t1.show(); // 显示 t1 的时间 t2.show(); // 显示 t2 的时间 mytime0 t3 = t1.sum(t2); // 计算 t1 和 t2 的和 t3.show(); // 显示 t3 的时间 ​ } ​ // 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单 // 调试程序: F5 或调试 >“开始调试”菜单 ​ // 入门使用技巧: // 1. 使用解决方案资源管理器窗口添加/管理文件 // 2. 使用团队资源管理器窗口连接到源代码管理 // 3. 使用输出窗口查看生成输出和其他消息 // 4. 使用错误列表窗口查看错误 // 5. 转到“项目”>“添加新项”以创建新的代码文件,或转到“项目”>“添加现有项”以将现有代码文件添加到项目 // 6. 将来,若要再次打开此项目,请转到“文件”>“打开”>“项目”并选择 .sln 文件 ​

使用运算符重载:

mytime0.h

#pragma once #ifndef __MYTIME0__H__ #define __MYTIME0__H__ ​ class mytime0 { private: int hours; int minutes; public: mytime0(); // 默认构造函数 mytime0(int h, int m = 0); // 带参数的构造函数 void add_min(int m); // 增加分钟 void add_hr(int h); // 增加小时 void reset(int h = 0, int m = 0); // 重置时间 //mytime0 sum(const mytime0& mt) const; // 求和函数 mytime0 operator+(const mytime0& mt) const; // 求和函数 void show() const; // 显示时间 }; ​ #endif // !__MYTIME0__H__ ​ ​ ​ ​

.

mytime0.cpp

#include "mytime0.h" #include <iostream> using namespace std; ​ ​ mytime0::mytime0() { hours = minutes = 0; // 默认构造函数初始化小时和分钟为0 } ​ mytime0::mytime0(int h, int m) { hours = h; // 设置小时 minutes = m; // 设置分钟 } ​ void mytime0::add_min(int m) { minutes += m; // 增加分钟 if (minutes >= 60) // 如果分钟超过60,转换为小时 { hours += minutes / 60; // 将分钟转换为小时 minutes %= 60; // 更新分钟 } } ​ void mytime0::add_hr(int h) { hours += h; // 增加小时 } ​ void mytime0::reset(int h, int m) { hours = h; // 重置小时 minutes = m; // 重置分钟 if (minutes >= 60) // 如果分钟超过60,转换为小时 { hours += minutes / 60; // 将分钟转换为小时 minutes %= 60; // 更新分钟 } } ​ /*然而,返回值不能是引用。因为函数将创建一个新的Time对象(sum),来表示另外两个 Time 对象的和。 *返回对象(如代码所做的那样)将创建对象的副本,而调用函数可以使用它。 *然而,如果返回类型为Time&,则引用的将是 sum 对象。 *但由于 sum 对象是局部变量,在函数结束时将被删除,因此引用将指向一个不存在的对象。 *使用返回类型 Time 意味着程序将在删除sum 之前构造它的拷贝,调用函数将得到该拷贝。 */ //mytime0 mytime0::sum(const mytime0& mt) const mytime0 mytime0::operator+(const mytime0& mt) const { mytime0 temp; // 创建一个临时mytime0对象 temp.hours = hours + mt.hours; // 将当前对象的小时和传入对象的小时相加 temp.minutes = minutes + mt.minutes; // 将当前对象的分钟和传入对象的分钟相加 if (temp.minutes >= 60) // 如果分钟超过60,转换为小时 { temp.hours += temp.minutes / 60; // 将分钟转换为小时 temp.minutes %= 60; // 更新分钟 } return temp; // 返回结果 } ​ void mytime0::show() const { cout << hours << " hours, " << minutes << " minutes" << endl; // 显示时间 }

.

project2.cpp

// project2.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 // ​ #include <iostream> #include "mytime0.h" int main() { std::cout << "Hello World!\n"; mytime0 t1 = mytime0(1, 36); mytime0 t2 = mytime0(2, 45); t1.show(); // 显示 t1 的时间 t2.show(); // 显示 t2 的时间 //mytime0 t3 = t1.sum(t2); // 计算 t1 和 t2 的和 mytime0 t3 = t1 + t2; // 计算 t1 和 t2 的和 t3.show(); // 显示 t3 的时间 ​ } ​ // 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单 // 调试程序: F5 或调试 >“开始调试”菜单 ​ // 入门使用技巧: // 1. 使用解决方案资源管理器窗口添加/管理文件 // 2. 使用团队资源管理器窗口连接到源代码管理 // 3. 使用输出窗口查看生成输出和其他消息 // 4. 使用错误列表窗口查看错误 // 5. 转到“项目”>“添加新项”以创建新的代码文件,或转到“项目”>“添加现有项”以将现有代码文件添加到项目 // 6. 将来,若要再次打开此项目,请转到“文件”>“打开”>“项目”并选择 .sln 文件 ​
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/1/24 23:33:34

Vue3 - Diff算法理解

Vue 版本&#xff1a;以 vue3.x 代码为参考&#xff0c;主要梳理 diff 算法的核心流程。 Vue 3 的 diff 算法借鉴了纯文本 diff 算法的思想&#xff0c;参考了 viv 和 inferno 框架的实现&#xff0c;只对需要处理的节点本身进行 diff 操作。通过预处理和最长递增子序列&#x…

作者头像 李华
网站建设 2026/1/18 4:28:33

3个颠覆性突破让开源CMS成为中小企业数字化转型的秘密武器

在数字化转型浪潮中&#xff0c;中小企业的IT预算往往捉襟见肘&#xff0c;而Directus作为一款完全开源的内容管理平台&#xff0c;正以零许可成本和高度灵活的技术架构&#xff0c;为预算有限的企业提供了一条全新的数字化路径。这款基于Node.js构建的现代化CMS&#xff0c;不…

作者头像 李华
网站建设 2026/1/16 16:08:38

PapersGPT for Zotero 终极安装指南:5步快速配置AI文献助手

PapersGPT for Zotero 终极安装指南&#xff1a;5步快速配置AI文献助手 【免费下载链接】papersgpt-for-zotero Zotero chat PDF with DeepSeek, GPT, ChatGPT, Claude, Gemini 项目地址: https://gitcode.com/gh_mirrors/pa/papersgpt-for-zotero PapersGPT for Zotero…

作者头像 李华
网站建设 2026/1/22 20:56:23

15-2.【Linux系统编程】进程信号 - 信号保存(信号处理流程的三种状态:未决、阻塞、递达,信号保存由未决表完成、sigset_t信号集类型及相关函数)

目录3. 保存信号-内核通过 “未决信号集” 为每个进程存储已产生但未处理的信号3.1 信号处理流程中的不同状态3.2 信号在内核中的表示3.3 sigset_t信号集类型3.4 信号集操作函数3.4.1 sigprocmask读取或更改进程的信号屏蔽字3.4.2 sigpending读取当前进程的未决信号集3.4.3 综合…

作者头像 李华
网站建设 2026/1/19 6:35:47

31、国际化文本输入方法详解

国际化文本输入方法详解 1. 字体集与字符显示 当 XFontSet 缺少字符集时,每个不可用的字符会使用 XCreateFontSet 返回的默认字符串来绘制。对于无效码点的行为则未作定义。 2. 输入方法概述 输入方法涵盖多个方面,包括输入方法概述、管理、功能、值、输入上下文功能与值…

作者头像 李华
网站建设 2026/1/25 1:01:38

33、本地化与国际化文本函数详解

本地化与国际化文本函数详解 在处理国际化文本输入时,有许多关键的概念和函数需要我们去理解和掌握。下面将详细介绍这些内容,包括输入方法值、输入上下文函数以及输入上下文值等方面。 输入方法相关函数与值 XUnregisterIMInstantiateCallback 函数:该函数用于移除之前…

作者头像 李华