C++中运算符重载详解及其作用介绍
概述运算符重载 (Operator Overloading)函数重载重载: 将同一名字重新赋予新的含义.函数重载: 对一个函数赋予新的含义, 使之实现新功能. 例如:12intmax(intx,inty);doublemax(doublea,doubleb,doublec);运算符也有重载: 赋予运算符新的含义, 使之一名多用. 例如123456789101112intmain() {inti 2, j 3;intk i j;string s1 good , s2 morning;string s3 s1 s2;cout k endl;cout s3 endl;return0;}输出结果:5good morning运算符重载通过运算符重载, 扩大了 C 已有运算符的作用, 使运算符能用于类对象. 使用运算符重载, 能使程序易于编写, 阅读和维护. 运算符被重载后, 其原有的功能仍然保留, 没有丧失过改变.运算符重载实质上是函数的重载:定义一个重载运算符的函数需要执行被重载的运算符时, 系统就自动调用该函数, 以实现相应的运算C 的运算符算数运算符: (加) -(减) *(乘) %(整除余数) (自加) – (自减)关系运算符: (大于) (小于) (等于) (大于等于) (小于等于) !(不等于)逻辑运算符: (逻辑与) ||(逻辑或) !(逻辑非)位运算符: (按位左移) (按位右移) (按位与) |(按位或) ∧(按位异或) ~(按位取反)赋值运算符: 及其扩展赋值运算符条件运算符: ?:都好运算符: ,指针运算符: *引用运算符合地址运算符: 求字节数运算符: sizeof强制类型转换运算符: (类型) 或 类型()成员运算符: .指向成员的运算符:-下标运算符: []其他: 如函数调用运算符 ()重载运算符的规则不允许创造新的运算符, 只能对已有 C 运算符进行重载.C 允许重载运算符: 成员运算符(.), 成员指针访问运算符(.*), 域运算符(:, 求字节数运算符(sizeof), 条件运算符(?重载不能改变运算符运算对象 (即操作数) 的个数重载不能改变运算符的优先级别重载不能改变运算符的结合性重载运算符的函数不能有默认的参数重载的运算符必须和用户定义的自定义类型的对象一起使用. 参数至少有一个是类对象或其 引用成员函数实现 Complex 加法Complex 类:123456789101112131415#ifndef PROJECT2_COMPLEX_H#define PROJECT2_COMPLEX_HclassComplex {private:doublereal;doubleimag;public:Complex();Complex(doubler,doublei);Complex add(Complex c2);voiddisplay();};#endif //PROJECT2_COMPLEX_HComplex.cpp:12345678910111213141516171819#include iostream#include Complex.husingnamespacestd;Complex::Complex() : real(0), imag(0) {}Complex::Complex(doubler,doublei) : real(r), imag(i) {}Complex Complex::add(Complex c2) {Complex c;c.real real c2.real;c.imag imag c2.imag;returnc;}voidComplex::display() {cout ( real , ;cout imag i) endl;}main:123456789101112intmain() {Complex c1(3, 4), c2(5, -10), c3;cout c1 ;c1.display();cout c2 ;c2.display();c3 c1.add(c2);cout c1 c2 ;c3.display();return0;}输出结果:c1 (3, 4i)c2 (5, -10i)c1 c2 (8, -6i)运算符重载的方法运算符重载格式:1函数类型 operator 运算符名称 (形参流标) {对运算符的重载处理}Complex 类:123456789101112131415#ifndef PROJECT4_COMPLEX_H#define PROJECT4_COMPLEX_HclassComplex {private:doublereal;doubleimag;public:Complex();Complex(double,double);voiddisplay();Complex operator(Complex c2);};#endif //PROJECT4_COMPLEX_HComplex.cpp:12345678910111213141516171819#include iostream#include Complex.husingnamespacestd;Complex::Complex() : real(0), imag(0) {}Complex::Complex(doubler,doublei) :real(r), imag(i) {}voidComplex::display() {cout ( real , ;cout imag i) endl;}Complex Complex::operator(Complex c2) {Complex c;c.real real c2.real;c.imag imag c2.imag;returnc;}main:1234567891011121314151617#include iostream#include Complex.husingnamespacestd;intmain() {Complex c1(3, 4), c2(5, -10), c3;cout c1 ;c1.display();cout c2 ;c2.display();c3 c1 c2;cout c1 c2 ;c3.display();return0;}输出结果:c1 (3, 4i)c2 (5, -10i)c3 (8, -6i)多种实现方法成员函数实现:123456Complex Complex::operator(Complex c2) {Complex c;c.real real c2.real;c.imag imag c2.imag;returnc;}简化:123Complex Complex::operator(Complex c2){returnComplex(real c2.real, imag c2.image);}友元函数实现:123Complex operator(Complex c1, Complex c2){......}实现 operatorComplex 类:123456789101112131415#ifndef PROJECT4_COMPLEX_H#define PROJECT4_COMPLEX_HclassComplex {private:doublereal;doubleimag;public:Complex();Complex(double,double);voiddisplay();Complex operator(constComplex c);};#endif //PROJECT4_COMPLEX_HComplex.cpp:123456789101112131415161718#include iostream#include Complex.husingnamespacestd;Complex::Complex() : real(0), imag(0) {}Complex::Complex(doubler,doublei) :real(r), imag(i) {}voidComplex::display() {cout ( real , ;cout imag i) endl;}Complex Complex::operator(constComplex c) {real c.real;// this-real c.real;imag c.imag;// this-imag c.imag;return*this;}main:1234567891011121314151617#include iostream#include Complex.husingnamespacestd;intmain() {Complex c1(3, 4), c2(5, -10), c3;cout c1 ;c1.display();cout c2 ;c2.display();c1 c2;cout c1 ;c1.display();return0;}输出结果:c1 (3, 4i)c2 (5, -10i)c1 (8, -6i)三种运算符重载函数运算符重载函数可以是类的成员函数:它可以通过 this 指针自由地访问本类的数据成员. 少写一个函数的参数, 但有要求.运算符重载函数可以是类的友元函数:如果运算符左侧的操作属于 C 标准类型 (如 int) 或是一个其他类的对象, 则运算符重载函数不能选用成员函数. 为方便访问类的私有成员, 声明为友元函数为佳.运算符重载函数还可以是普通函数:只有极少的情况下才使用 (因普通函数一般不能直接访问类的私有成员)成员函数实现Complex 类:123456789101112131415#ifndef PROJECT4_COMPLEX_H#define PROJECT4_COMPLEX_HclassComplex {private:doublereal;doubleimag;public:Complex();Complex(double,double);voiddisplay();Complex operator(doubled);// 成员函数实现};#endif //PROJECT4_COMPLEX_HComplex.cpp:12345678910111213141516#include iostream#include Complex.husingnamespacestd;Complex::Complex() : real(0), imag(0) {}Complex::Complex(doubler,doublei) :real(r), imag(i) {}voidComplex::display() {cout ( real , ;cout imag i) endl;}Complex Complex::operator(doubled) {returnComplex(real d, imag);}友元函数实现Complex 类:123456789101112131415#ifndef PROJECT4_COMPLEX_H#define PROJECT4_COMPLEX_HclassComplex {private:doublereal;doubleimag;public:Complex();Complex(double,double);voiddisplay();friendComplex operator(Complex c,doubled);// 友元函数};#endif //PROJECT4_COMPLEX_HComplex.cpp:12345678910111213141516#include iostream#include Complex.husingnamespacestd;Complex::Complex() : real(0), imag(0) {}Complex::Complex(doubler,doublei) :real(r), imag(i) {}voidComplex::display() {cout ( real , ;cout imag i) endl;}Complex operator(Complex c,doubled) {returnComplex(c.real d, c.imag);}输出结果main:123456789101112131415161718#include iostream#include Complex.husingnamespacestd;intmain() {Complex c1(3, 4), c2(5, -10), c3, c4;cout c1 ;c1.display();cout c2 ;c2.display();c3 c1 3.14;cout c3 ;c3.display();return0;}输出结果:c1 (3, 4i)c2 (5, -10i)c3 (6.14, 4i)重载单元运算符单元运算符 (unary operation), 即只有一个运算量. 如: !a, -b, c, *p, i, i-- 等.例子重载单元运算符实现分数对象的相反数.Fraction 类:12345678910111213141516171819#ifndef PROJECT4_FRACTION_H#define PROJECT4_FRACTION_H#include iostreamusingnamespacestd;classFraction {private:intnume;// 分子intdeno;// 分母public:Fraction();Fraction(int,int);Fraction operator-(constFraction c);// 分数相减Fraction operator-();// 取反一目运算friendostream operator(ostream output,constFraction f);};#endif //PROJECT4_FRACTION_HFraction.cpp:12345678910111213141516171819#include Fraction.hFraction::Fraction() : nume(0), deno(0) {}Fraction::Fraction(intn ,intd) : nume(n), deno(d) {}Fraction Fraction::operator-(constFraction c) {returnFraction(nume*c.deno - c.nume*deno, deno*c.deno);}Fraction Fraction::operator-() {returnFraction(-nume, deno);}ostream operator(ostream output,constFraction f) {doubleresult (double)f.nume / f.deno;output result endl;returnoutput;}main:123456789101112131415#include iostream#include Fraction.husingnamespacestd;intmain() {Fraction f1(1,3), f2(1,5), f3, f4;f3 f1 - f2;// 分数相减f4 -f1;// 分数取反cout f3;cout f4;return0;}输出结果:0.133333-0.333333重载二元运算符二元运算符 (binary operation).有两个操作数, 通常在运算符的左右两侧 (例如: 32, 58, x*3)重载双目运算符时, 函数中应该有两个参数例子要求:定义字符串类 String, 用来存放不定长的字符串重载关系运算符, 用于两个字符串的比较运算步骤:定义类的 “框架”完善运算符重载String 类:123456789101112131415#ifndef PROJECT4_STRING_H#define PROJECT4_STRING_H#include cstdlibclassString {private:char*p;public:String(){pnullptr;}String(char*str);voiddisplay();};#endif //PROJECT4_STRING_HString.cpp:12345678910111213#include iostream#include cstring#include String.husingnamespacestd;String::String(char*str) {p newchar[sizeof(str)];strcpy(p, str);}voidString::display() {cout p;}main:123456789101112131415#include iostream#include String.husingnamespacestd;intmain() {String s1(Hello);String s2(China);s1.display( );cout ;s2.display( );coutendl;return0;}输出结果:Hello China重载 I/O通过重载输入流 (input stream) 和输出流 (output stream), 我们可以用来输出用户自己定义的数据.

相关新闻

混合专家模型(MoE)原理与在视觉语言模型(VLA)中的实践指南

混合专家模型(MoE)原理与在视觉语言模型(VLA)中的实践指南

在AI模型快速发展的今天,如何平衡模型性能与计算效率成为业界关注的焦点。混合专家模型(MoE)作为解决这一难题的创新架构,正在引领新一代AI模型的设计方向。本文将深入解析MoE的核心原理、技术实现及其在视觉语言模型(…

2026/7/13 5:45:37阅读更多 →
EdgeRemover:Windows系统彻底卸载Microsoft Edge的专业级解决方案

EdgeRemover:Windows系统彻底卸载Microsoft Edge的专业级解决方案

EdgeRemover:Windows系统彻底卸载Microsoft Edge的专业级解决方案 【免费下载链接】EdgeRemover A PowerShell script that correctly uninstalls or reinstalls Microsoft Edge on Windows 10 & 11. 项目地址: https://gitcode.com/gh_mirrors/ed/EdgeRemove…

2026/7/13 5:45:37阅读更多 →
Git 浅克隆后恢复完整仓库的 3 种方法对比:配置修改 vs --unshallow vs 重新克隆

Git 浅克隆后恢复完整仓库的 3 种方法对比:配置修改 vs --unshallow vs 重新克隆

Git浅克隆后恢复完整仓库的深度技术解析与方案选型指南1. 浅克隆技术原理与典型应用场景浅克隆(Shallow Clone)作为Git的高级功能,通过--depth参数实现了部分历史记录的获取。其核心机制是创建一个仅包含指定深度提交记录的仓库副本&#xff…

2026/7/13 5:45:37阅读更多 →
终极Wand-Enhancer完全指南:免费解锁专业版功能的技术解析

终极Wand-Enhancer完全指南:免费解锁专业版功能的技术解析

终极Wand-Enhancer完全指南:免费解锁专业版功能的技术解析 【免费下载链接】Wand-Enhancer Advanced UX and interoperability extension for Wand (WeMod) app 项目地址: https://gitcode.com/gh_mirrors/we/Wand-Enhancer Wand-Enhancer是一款专为Wand&…

2026/7/13 7:00:42阅读更多 →
3分钟免费解锁WeMod Pro:WandEnhancer终极指南

3分钟免费解锁WeMod Pro:WandEnhancer终极指南

3分钟免费解锁WeMod Pro:WandEnhancer终极指南 【免费下载链接】Wand-Enhancer Advanced UX and interoperability extension for Wand (WeMod) app 项目地址: https://gitcode.com/gh_mirrors/we/Wand-Enhancer 还在为WeMod的高级功能付费而烦恼吗&#xff…

2026/7/13 7:00:42阅读更多 →
A3910与PIC18LF25J11在BLDC电机控制中的黄金组合

A3910与PIC18LF25J11在BLDC电机控制中的黄金组合

1. A3910与PIC18LF25J11的硬件搭档解析A3910是Allegro MicroSystems推出的三相无刷直流(BLDC)电机驱动器,而PIC18LF25J11则是Microchip的8位单片机。这对组合在电机控制领域堪称黄金搭档——前者负责功率驱动,后者处理控制逻辑。我…

2026/7/13 7:00:42阅读更多 →
2026最新Java核心基础面试全解(JDK8-21通用原理+实战复盘)

2026最新Java核心基础面试全解(JDK8-21通用原理+实战复盘)

2026最新Java核心基础面试全解(JDK8-21通用原理实战复盘) 在Java后端面试体系中,JVM底层机制、字符串内核、垃圾回收规则、引用类型是常年必考的核心基础,也是区分初级开发者与进阶开发者的关键标尺。随着JDK版本持续迭代&#x…

2026/7/13 7:00:42阅读更多 →
J-Flash V7.96 独立擦除与编程:解决Keil下载失败的3种典型场景

J-Flash V7.96 独立擦除与编程:解决Keil下载失败的3种典型场景

J-Flash V7.96 独立擦除与编程:突破Keil下载困境的实战指南 当Keil的"Flash Download failed - Cortex-M4"错误反复出现时,嵌入式开发者往往陷入调试僵局。本文将深入剖析三种典型场景的解决方案,并提供可直接复用的J-Flash工程配…

2026/7/13 7:00:42阅读更多 →
LayerNorm与RMSNorm:大模型归一化技术演进与LLaMA实现

LayerNorm与RMSNorm:大模型归一化技术演进与LLaMA实现

这次我们来深入探讨一个在大模型领域备受关注的技术话题:LayerNorm与RMSNorm的演进关系。如果你正在准备AI相关岗位的面试,或者对Transformer架构的底层优化感兴趣,这篇文章将为你提供从理论到实践的完整解析。归一化技术是深度学习模型训练稳…

2026/7/13 6:55:42阅读更多 →
VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异当你在VSCode中启动一个新的TypeScript项目时,第一个技术决策往往从安装方式开始。这个看似简单的选择——全局安装还是项目本地安装——实际上会深刻影响你的开发流程、团队协作和…

2026/7/13 4:47:19阅读更多 →
智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手 【免费下载链接】zhihuishu 智慧树刷课插件,自动播放下一集、1.5倍速度、无声 项目地址: https://gitcode.com/gh_mirrors/zh/zhihuishu 智慧树刷课插件是一款专为智慧树在线教育平台设计的Chrome浏…

2026/7/13 0:50:34阅读更多 →
Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 你是否在GOG或Epic Games Store购买了心仪的游戏…

2026/7/13 4:52:09阅读更多 →
卡梅德生物技术快报|蛋白质分离纯化:肠激酶可溶性原核表达 + 两步层析全参数|标准化蛋白质分离纯化 SOP

卡梅德生物技术快报|蛋白质分离纯化:肠激酶可溶性原核表达 + 两步层析全参数|标准化蛋白质分离纯化 SOP

研究痛点提出(提出问题)重组肠激酶是融合标签切除核心工具酶,当前原核表达体系存在三大标准化难题,直接阻碍可复现的蛋白质分离纯化流程搭建:Trx、GST、单 SUMO 标签融合产物绝大多数为包涵体,沉淀占比超 9…

2026/7/13 0:04:58阅读更多 →
语音转文字工具AsrTools:让音频整理变得简单高效

语音转文字工具AsrTools:让音频整理变得简单高效

语音转文字工具AsrTools:让音频整理变得简单高效 【免费下载链接】AsrTools ✨ AsrTools: Smart Voice-to-Text Tool | Efficient Batch Processing | User-Friendly Interface | No GPU Required | Supports SRT/TXT Output | Turn your audio into accurate text …

2026/7/13 0:04:58阅读更多 →
Palworld存档编辑完全掌握:从零开始实现游戏数据可视化修改

Palworld存档编辑完全掌握:从零开始实现游戏数据可视化修改

Palworld存档编辑完全掌握:从零开始实现游戏数据可视化修改 【免费下载链接】palworld-save-tools Tools for converting Palworld .sav files to JSON and back 项目地址: https://gitcode.com/gh_mirrors/pa/palworld-save-tools 你是否曾经想要调整Palwor…

2026/7/13 0:04:58阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/13 4:21:17阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/13 4:08:53阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/12 21:43:43阅读更多 →