《C++》面向对象编程--类(下)

文章目录

  • 一、赋值运算符重载
    • 1.1定义
    • 1.2基本规则
    • 1.3为什么需要运算符重载?
    • 1.4示例:
  • 二、前置++和后置++区别
    • 2.1前置++的实现与特点
    • 2.2后置++的实现与特点
    • 2.3核心区别
  • 三、const
  • 四、取地址及const取地址操作符重载
    • 4.1定义
    • 4.2语法
    • 4.3注意事项

一、赋值运算符重载

1.1定义

运算符重载是C++的一项特性,允许我们为自定义类型(类或结构体)重新定义运算符的行为(如+, -, =, ==等),使其像内置类型一样直观操作。如果用户没有显式实现时,编译器会生成一个默认赋值运算符重载,以值的方式逐字节拷贝。

1.2基本规则

1. 函数命名

运算符重载函数的名称必须是 operator 后接运算符符号。

返回值类型 operator运算符(参数列表)

示例:

ClassName& operator=(const ClassName& other) {if (this != &other) {  // 关键点1:自赋值检查// 释放旧资源 + 深拷贝新资源}return *this;  // 关键点2:返回引用支持链式赋值
}

2. 关键限制
❌ 不能创建新运算符(如 operator@ 是非法的)。
❌ 不能修改内置类型的运算符含义(例如 int 的 + 必须保持加法语义)。
❌ 以下运算符不可重载:
.* :: sizeof ?: .
3. 参数规则

  • 如果重载为成员函数,第一个操作数是隐式的 this,参数比操作数少1。
    例如 a + b 会调用 a.operator+(b)。

  • 如果重载为全局函数,参数数量必须与操作数一致。
    例如 operator+(a, b)。

1.3为什么需要运算符重载?

  • 提升代码可读性:date1 < date2 比 date1.isEarlierThan(date2) 更直观。

  • 保持一致性:让自定义类型像内置类型一样工作。

  • 支持标准库算法:如 std::sort 依赖 < 运算符。

1.4示例:

h文件:
#pragma once
#pragma once
#include<iostream>
using namespace std;class Date
{
public:Date(int year = 1, int month = 1, int day = 1);void Print(){cout << _year << "-" << _month << "-" << _day << endl;}bool operator<(const Date& x);bool operator==(const Date& x);bool operator<=(const Date& x);bool operator>(const Date& x);bool operator>=(const Date& x);bool operator!=(const Date& x);int GetMonthDay(int year, int month);//+xx天的情况Date& operator+=(int day);Date operator+(int day);Date& operator++();Date operator++(int);
private:int _year;int _month;int _day;
};
cpp文件
#include "20250722A.h"Date::Date(int year, int month, int day)
{_year = year;_month = month;_day = day;
}bool Date::operator<(const Date& x)
{if (_year < x._year){return true;}else if (_year == x._year && _month < x._month){return true;}else if (_year == x._year && _month == x._month && _day < x._day){return true;}return false;
}bool Date::operator==(const Date& x)
{return _year == x._year&& _month == x._month&& _day == x._day;
}bool Date::operator<=(const Date& x)
{return *this < x || *this == x;
}bool Date::operator>(const Date& x)
{return !(*this <= x);
}bool Date::operator>=(const Date& x)
{return !(*this < x);
}bool Date::operator!=(const Date& x)
{return !(*this == x);
}int Date::GetMonthDay(int year, int month)
{static int daysArr[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };if (month == 2 && ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)))//先判断month是否等于2可以提高效率{return 29;}else{return daysArr[month];}
}Date& Date::operator+=(int day)
{_day += day;while (_day > GetMonthDay(_year, _month)){_day -= GetMonthDay(_year, _month);++_month;if (_month == 13){++_year;_month = 1;}}return *this;
}Date Date::operator+(int day)
{Date tmp(*this);tmp += day;return tmp;}
int main()
{Date d1(2025, 7, 24);d1 = d1 + 100;d1.Print();return 0;
}

二、前置++和后置++区别

2.1前置++的实现与特点

Date& Date::operator++() {*this += 1;      // 调用已重载的+=return *this;    // 返回当前对象的引用
}

使用示例:

Date d(2023, 1, 1);
++d;  // 等价于 d.operator++()

2.2后置++的实现与特点

Date Date::operator++(int) {Date tmp = *this;  // 保存旧值*this += 1;        // 修改当前对象return tmp;        // 返回旧值副本
}

使用示例:

Date d1(2023, 1, 1);
Date d2 = d1++;  // d2获得旧值,d1自增

2.3核心区别

在这里插入图片描述

// 前置++(推荐)
for (int i = 0; i < n; ++i)  // 无临时对象生成// 后置++
for (int i = 0; i < n; i++)  // 每次循环构造临时int

故我们更推荐使用前置++。

三、const

const 是 C++ 中的关键字,用于定义"常量"或"不可修改"的变量、函数参数、成员函数等。它的核心作用是增强程序的安全性和可读性,帮助编译器在编译阶段发现潜在的错误。

  • const对象只能调用const成员函数
  • const成员函数对任何对象都是安全的
  • const成员函数内不可以调用其它的非const成员函数
  • 非const成员函数内可以调用其它的const成员函数

四、取地址及const取地址操作符重载

4.1定义

在 C++ 中,取地址操作符 & 可以被重载,包括普通版本和 const 版本。这种重载允许你控制当用户获取类对象地址时的行为。

4.2语法

class MyClass {
public:// 普通取地址操作符重载MyClass* operator&() {return this; // 通常返回 this,但可以自定义}// const 取地址操作符重载const MyClass* operator&() const {return this; // 通常返回 this,但可以自定义}
};

4.3注意事项

  • 通常不建议重载取地址以及const取地址操作符,除非有充分理由,因为这可能违反用户预期

  • 如果重载了取地址操作符,确保行为合理且文档化

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

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

相关文章

EasyExcel 模板导出数据 + 自定义策略(合并单元格)

需求&#xff1a;数据库里的主表明细表&#xff0c;联查出数据并导出Excel&#xff0c;合并主表数据的单元格。代码&#xff1a;controllerPostMapping("export")ApiOperation(value "导出数据")protected void export(ApiParam Valid RequestBody NewWms…

股指期权可以随时平仓吗?

本文主要介绍股指期权可以随时平仓吗&#xff1f;股指期权是否可以随时平仓&#xff0c;需结合交易规则、合约状态及市场流动性综合判断&#xff0c;具体如下。股指期权可以随时平仓吗&#xff1f;一、正常交易时间内的平仓规则在交易日的交易时段内&#xff08;如国内上证50ET…

成品电池综合测试仪:保障电池品质与安全的核心工具|深圳鑫达能

随着新能源汽车、储能系统、消费电子等领域的快速发展&#xff0c;电池作为核心能源组件&#xff0c;其性能与安全性直接关系到产品的整体质量与用户体验。成品电池综合测试仪作为电池生产与质检环节的关键设备&#xff0c;通过模拟真实使用场景&#xff0c;对电池的电气性能、…

智慧工厂网络升级:新型 SD-WAN 技术架构与应用解析

1. 智慧工厂对网络的核心需求智慧工厂的网络需求高度复杂&#xff0c;主要体现在以下几个方面&#xff1a;高可靠性与低延迟工厂中的生产执行系统&#xff08;MES&#xff09;、设备监控系统&#xff08;如 PLC/SCADA&#xff09;、产品生命周期管理系统&#xff08;PLM&#x…

在 Windows 使用 Nginx/HAProxy 实现负载均衡

在本实验中&#xff0c;我们将在 Windows 系统 上使用 Python 编写一个 TCP 服务器&#xff0c;并启动两个服务实例。然后使用 Nginx 或 HAProxy 作为负载均衡器&#xff0c;将来自多个客户端的请求分发到这两个服务实例上&#xff0c;验证负载均衡效果。 &#x1f9e9; 环境准…

【物联网】基于树莓派的物联网开发【17】——物联网通信协议MQTT基础知识

使用背景 MQTT最初是为了解决物联网&#xff08;IoT&#xff09;领域设备之间的低带宽、高延迟、不稳定网络连接等问题而设计的。 场景介绍 广泛应用物联网领域&#xff0c;数据实时传输&#xff0c;连接各种智能设备和应用的关键桥梁 MQTT简介和概述 MQTT&#xff08;Message …

【qml-3】qml与c++交互第二次尝试(类型方式)

背景&#xff1a; 【qml-1】qml与c交互第一次尝试&#xff08;实例方式&#xff09; 【qml-2】尝试一个有模式的qml弹窗-CSDN博客 【qml-3】qml与c交互第二次尝试&#xff08;类型方式&#xff09; 还是qml学习笔记。 这次搁置太久了。其实不太会&#xff0c;还是以教程为主…

输电线路观冰精灵在线监测装置:科技赋能电网安全的新利器

一、技术架构与工作原理输电线路观冰精灵在线监测装置&#xff08;简称“观冰精灵”&#xff09;是一款集成多源感知、智能分析、远程通信于一体的专业化覆冰监测设备。其核心功能通过以下技术路径实现&#xff1a;1. 数据采集模块视觉识别系统&#xff1a;搭载工业级夜视摄像机…

Ubuntu22 上,用C++ gSoap 创建一个简单的webservice

创建calc.h// calc.h // gSOAP 服务定义 int ns__add(double a, double b, double &result); int ns__subtract(double a, double b, double &result);创建my_server.cpp#include "soapService.h" #include "ns.nsmap" class MyService : public S…

Java(LinkedList和ArrayList底层分析)

LinkedList全面说明:LinkedList底层操作机制:LinkedList的方法:add():增加节点对象remove():删除一个节点对象(默认删除第一个节点对象)set():修改一个节点对象get():得到一个节点对象LinkedList的遍历:增强for循环迭代器普通for循化LinkedList的源码解读:增加源码:1. LinkedLi…

开源项目XBuilder的user逻辑

stores \ userquery-keys.ts 统一管理Vue Query&#xff08;TanStack Query的Vue适配版本&#xff09;缓存键&#xff0c;在下面的文件中复用index.ts 入口文件&#xff0c;统一用户信息查询signed-in.ts 登录状态管理、认证逻辑在用户登录后&#xff0c;系统颁发一个令牌&…

第十五章 SEO的简单免费工具

SEO的基础工具和检测 前文中主要是讲一些SEO的网站基本功&#xff0c;而在这一章那&#xff0c;会讲到一些非常基本的工具&#xff0c;主要是关于&#xff1a;网站的流量、停留时长、关键词密度、内容、以及Google的站长工具。 Google Search Console Google Search Console这是…

SSL 证书与 HTTPS 的关系:一文理清核心关联

HTTPS&#xff08;Hypertext Transfer Protocol Secure&#xff09;和 SSL 证书&#xff08;Secure Sockets Layer Certificate&#xff09;是网络安全的两大基石&#xff0c;它们共同保障了互联网通信的安全性和可信度。以下从定义、功能、关系及实际应用层面进行解析&#xf…

使用Jmeter参数化实现接口自动化测试

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 本文记录如何使用Jmeter参数化&#xff08;csv)实现接口自动化——测试Token不同入参情况下&#xff0c;接口请求能够返回正确的结果1. 首先需要使用Jmeter获取一个…

X-plore File Manager v4.34.02 修改版:安卓设备上的全能文件管理器

在使用安卓设备时&#xff0c;文件管理是日常操作中不可或缺的一部分。X-plore File Manager 作为一款功能强大的文件管理器&#xff0c;凭借其丰富的功能和便捷的操作&#xff0c;成为安卓用户管理文件的首选工具之一。最新版 v4.34.02 修改版更是解锁了更多高级功能&#xff…

React+threejs两种3D多场景渲染方案

在现代 Web 开发中&#xff0c;3D 可视化需求日益增长&#xff0c;特别是在 React 生态系统中实现多 3D 场景的展示与交互。本文通过对比两种实现方案&#xff0c;探讨 React 中构建多 3D 场景的最佳实践&#xff0c;分析它们的技术特点、性能表现和适用场景。方案一&#xff1…

React性能优化终极指南:memo、useCallback、useMemo全解析

掌握 React.memo、useCallback、useMemo 的正确使用姿势&#xff0c;让你的 React 应用性能飞起来&#xff01; &#x1f3af; React.memo 作用 React.memo 是一个高阶组件&#xff0c;用于函数组件&#xff0c;通过浅比较 props 的变化来决定是否重新渲染。如果 props 没有变…

借助 VR 消防技术开展应急演练,检验完善应急预案​

应急演练是企业应对火灾事故的重要手段&#xff0c;而 VR 消防技术的应用&#xff0c;为应急演练带来了全新的体验和更高的效率。VR 消防技术通过虚拟现实技术模拟逼真的火灾场景&#xff0c;让参与者能够身临其境地感受火灾发生时的紧张氛围。某知名物流企业&#xff0c;仓库众…

【电赛学习笔记】MaxiCAM 项目实践——二维云台追踪指定目标

前言 本文是对视觉模块MaixCam实现二维云台人脸跟踪_哔哩哔哩_bilibili大佬的项目实践整理与拓展&#xff0c;侵权即删。 单路舵机基本控制 #导入必要模块 from maix import pwm, time , pinmap#定义全局变量&#xff0c;设初值 SERVO_FREQ 50 #主频 SERVO_MIN_DUT…

深入解析 ArkUI 触摸事件机制:从点击到滑动的开发全流程

摘要 随着 HarmonyOS NEXT 的不断发展&#xff0c;ArkUI 逐渐成为主流的 UI 构建方式。而用户交互在任何应用中都是基础而又关键的一环&#xff0c;如何利用 ArkUI 提供的触摸事件机制&#xff0c;如 onTouch、onClick、onSwipe 等&#xff0c;来实现自然、顺滑、用户友好的交互…