当前位置: 首页 > news >正文

C++类与对象(中)②

目录

1.赋值运算符重载

1.1运算符重载

1.2赋值运算符重载

1.2.1赋值运算符重载格式

1.2.2赋值运算符只能重载成成员函数不能重载成全局函数 

1.2.3同拷贝函数一样,如果类是形如日期类这样变量全是内置类型的,赋值运算符就必须自己实现,用编译器默认生成的就行,但是如果涉及到资源管理就必须要自己实现赋值运算符。

1.3前置++和后置++重载

2.const成员函数

3.取地址及const取地址操作符重载


 

                                                                时光不语,我们都在努力

这里是来自M--Y的专栏:C++启航

以下内容均为个人见解,如有不足还请指出

期待大家的点赞、收藏、评论(互三必回)诸君共勉

类中的6个默认成员函数

1.赋值运算符重载

1.1运算符重载

         运算符重载提高代码可读性。函数命名为关键字operator后面接需要重载的运算符符号

特别注意:

        1.不能通过连接其他符号来创建新的操作符,如operator@

        2.重载操作符必须有一个类类型参数

        3.用于内置类型的运算符,其含义不能改变

        4.作为类成员函数重载时,其形参看起来比操作数数目少1,这是因为成员函数的第一个参数是隐式的this

        5..*        ::        sizeof        ?;        .这五个运算符不支持重载

class Date

{

public:

       // ……

private:

        int  _year;

        int  _month;

        int  _day;

bool  operator==(const  Date& d1,const  Date& d2)

{

        //……

}

如果和上述代码一样定义成全局函数的话,就无法访问到Date类中的私有成员变量,如果要使代码编译通过的话,就必须将上述代码标红处给注释掉。

这样处理的话,显得过于麻烦,所以不如将函数封装成成员函数

封装成成员函数的时候我们需要注意一点,上面注意4提到,成员函数的第一个参数是隐式的this所以在代码上要做些许调整。

class Date

{

public:

        bool operator==(const Date& d)

        {

                return _year==d._year

                &&_month=d._month

                &&_day==d._month;

        }

private:

        int _year;

        int _month;

        int _day;

} ;

1.2赋值运算符重载

1.2.1赋值运算符重载格式

        1.参数类型:const T&(传递引用可以提高传参效率)

        2.返回值类型:T&。返回引用可以提高效率,同时在有些情况下可以支持连续赋值

        3.检测是否自己给自己赋值

        4.返回*this。目的:连续赋值,下文会细讲

1.2.2赋值运算符只能重载成成员函数不能重载成全局函数 

原因:如果用户将赋值运算符实现成全局的话,编译器就会自己生成一个默认的成员函数,这样两者就会产生冲突了

class Date

{

public:

        //……

        Date& operator=(const Date&d)

        {

                _year=d._year;

                _month=d._month;

                _day=d._day; 

                

                return *this;

        }

};

1.2.3同拷贝函数一样,如果类是形如日期类这样变量全是内置类型的,赋值运算符就必须自己实现,用编译器默认生成的就行,但是如果涉及到资源管理就必须要自己实现赋值运算符。

1.3前置++和后置++重载

思考:由上面叙述可以联想到关于++的运算符重载的函数名应该是operator++,但是这样的话如何区分前置++和后置++呢?

为了区分,C++特别规定:后置++重载时多加一个int类型的参数,但是调用时不用传参,编译器会自动传递。

//前置++

Date& operator++() 

{

        _day++;

        _month++;

        _year++;

        if(_day>GetMonthday())//实现输出某年某月的天数

        {

                _day-=GetMonthday();

                _month++

        }

        if(_month>=13)

        {

                _month-=12;

                _year++;

        }

        return *this;

}

后置++

//注意后置++是先是有后+1,因此需要一个临时变量来保存原来的值,所以函数的返回值应该是Date而不是Date&

Date operator++(int)

{

        Date temp=*this;

        //重复上述前置++步骤

        return temp;

 其实关于运算符的重载有很多+=,-=,+,-,>,<,>=,<=。但是如果每个运算符都按上述方式代码就会显得十分冗长。有没有什么办法呢?        答案是肯定的。

Date& Date:: operator+=(int day)//日期+天数=日期
{
    _day += day;

    while (_day > GetMonthDay(_year, _month))
    {
        _day -= GetMonthDay(_year, _month);
        _month++;
        if (_month == 13)
        {
            _year++;
            _month = 1;
        }
    }

    while (_day < 0)
    {
        _month--;
        if (_month == 0)
        {
            _year--;
            _month = 12;
        }
        _day += GetMonthDay(_year, _month);
    }

    return *this;
}

以上上+=为例,当我们实现一个运算符重载后,和它相关的运算符重载就会变得很简单实现,只需要进行复用就行 。

Date& operator-=(int day)//日期-天数=日期

{

        return *this+=-day

}

 Date& operator++()

{

      return *this+=1;

}

Date operator++(int)

{

        Date temp=*this;

        *this+=1;

        return temp;

 其他的运算符重载也和这类似,感兴趣的可以自己去尝试实现。

2.const成员函数

用cosnt修饰的成员函数被称为const函数,实际上const修饰的是成员函数中的this,但是一般const修饰变量会加在其前面,而this是隐式的,如何表示修饰的是this呢?

C++规定将cosnt+在函数后面,就表示对this的修饰。

Date operator+(int day) const

{

        //……

}

3.取地址及const取地址操作符重载

这两个函数一般不用重新定义,不是特殊情况,编译器会自动生成的够用。

Date* operator&()

{

        return this;

}

const Date* operator&() const

{

        return this;

}

 

相关文章:

C++类与对象(中)②

目录 1.赋值运算符重载 1.1运算符重载 1.2赋值运算符重载 1.2.1赋值运算符重载格式 1.2.2赋值运算符只能重载成成员函数不能重载成全局函数 1.2.3同拷贝函数一样&#xff0c;如果类是形如日期类这样变量全是内置类型的&#xff0c;赋值运算符就必须自己实现&#xff0c;…...

Qt——xml文件生成DBus接口

1. 如何根据xml文件生成Dbus接口 要使用 XML 文件生成 D-Bus 接口&#xff0c;你可以按照以下步骤操作&#xff1a; 步骤 1: 准备 XML 文件 确保你的 XML 文件遵循 D-Bus 的接口描述规范。这通常包括定义接口、方法、信号和属性。一个基本的例子如下&#xff1a; <!DOCTYPE…...

初识SpringMVC(SpringMVC学习笔记一)

1 、还是熟悉的配方&#xff0c;先创建一个父Maven项目&#xff08;忘记怎么创建项目了就去前面翻笔记&#xff09;&#xff0c;导入通用的配置依赖 <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instan…...

FreeRTOS任务管理

1. 任务状态理论讲解 定时器职中断周期此处的1000Hz表示的是没次间隔1毫秒就记一次数&#xff08;在FreeConfig.h&#xff09;文件中进行配置 #define configTICK_RATE_HZ ( ( TickType_t ) 1000 ) 判断是否需要任务切换在FreeRTOS里面每次间隔1毫秒切换一次&#xff08;程序…...

Qwen1.5大语言模型微调实践

在人工智能领域&#xff0c;大语言模型&#xff08;Large Language Model&#xff0c;LLM&#xff09;的兴起和广泛应用&#xff0c;为自然语言处理&#xff08;NLP&#xff09;带来了前所未有的变革。Qwen1.5大语言模型作为其中的佼佼者&#xff0c;不仅拥有强大的语言生成和理…...

购物车实现

目录 1.购物车常见的实现方式 2.购物车数据结构介绍 3.实例分析 1.controller层 2.service层 1.购物车常见的实现方式 方式一&#xff1a;存储到数据库 性能存在瓶颈方式二&#xff1a;前端本地存储 localstorage在浏览器中存储 key/value 对&#xff0c;没有过期时间。s…...

HTML5漫画风格个人介绍源码

源码介绍 HTML5漫画风格个人介绍源码&#xff0c;源码由HTMLCSSJS组成&#xff0c;记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务器里面&#xff0c;重定向这个界面 效果截图 源码下载 HTML5漫画风格…...

工业数学模型——高炉煤气发生量预测(三)

1、工业场景 冶金过程中生产的各种煤气&#xff0c;例如高炉煤气、焦炉煤气、转炉煤气等。作为重要的副产品和二次能源&#xff0c;保证它们的梯级利用和减少放散是煤气能源平衡调控的一项紧迫任务&#xff0c;准确的预测煤气的发生量是实现煤气系统在线最优调控的前提。 2、…...

pnpm - Failed to resolve loader: cache-loader. You may need to install it.

起因 工作原因需要研究 vue-grid-layout 的源码&#xff0c;于是下载到本地。因为我习惯使用 pnpm&#xff0c;所以直接用 pnpm i 安装依赖&#xff0c;npm run serve 启动失败。折腾了一番没成功。 看到源码里有 yarn.lock&#xff0c;于是重新用 yarn install 安装依赖&…...

CSS transition和animation的用法和区别

Transition和Animation在CSS中都是用于实现元素状态变化的效果&#xff0c;但它们在用法和特性上存在明显的区别。 Transition transition是过度属性&#xff0c;主要强调的是元素状态的过渡效果。 它通常用于在元素的状态发生变化时&#xff0c;平滑地过渡到一个新的状态。…...

书籍推荐(附上每本书的看点)

1、《FPGA深度解析》&#xff0c;这本书的FIFO部分我觉得讲得很好; 2、《verilog数字系统设计教程》&#xff0c;夏宇闻老师的蓝皮书&#xff0c;这本书里包含很多考试知识点; 3、《SOC设计方法和实现》郭炜老师写的&#xff0c;我觉得他的低功耗设计讲得很好; 《高级FPGA设计结…...

LLM理解v1

答疑 什么是知识库&#xff1f; LLM&#xff08;Large Language Models&#xff0c;大型语言模型&#xff09;如GPT系列&#xff0c;通常是基于海量的文本数据进行训练的。它们通过分析和理解这些数据来生成回答、撰写文章、解决问题等。当我们提到LLM的“本地知识库”时&…...

ubuntu 22.04 -- cmake安装

安装方式一&#xff1a;源码安装 1、下载安装包 官网下载&#xff1a;下载链接&#xff1a;Download CMake 也可以使用命令行下载 wget https://github.com/Kitware/CMake/releases/download/v3.26.5/cmake-3.26.5.tar.gz2、解压并安装 # 1、解压 tar -zxvf cmake-3.26.5.…...

字符串算法题(第二十四天)

344. 反转字符串 题目 编写一个函数&#xff0c;其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。 不要给另外的数组分配额外的空间&#xff0c;你必须**原地修改输入数组**、使用 O(1) 的额外空间解决这一问题。 示例 1&#xff1a; 输入&#xff1…...

【Linux】应用层协议序列化和反序列化

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;折纸花满衣 &#x1f3e0;个人专栏&#xff1a;题目解析 &#x1f30e;推荐文章&#xff1a;C【智能指针】 前言 在正式代码开始前&#xff0c;会有一些前提知识引入 目录 &#x1f449;&#x1f3fb;序列…...

使用Canal同步MySQL 8到ES中小白配置教程

&#x1f680; 使用Canal同步MySQL 8到ES中小白配置教程 &#x1f680; 文章目录 &#x1f680; 使用Canal同步MySQL 8到ES中小白配置教程 &#x1f680;**摘要****引言****正文**&#x1f4d8; 第1章&#xff1a;初识Canal1.1 Canal概述1.2 工作原理解析 &#x1f4d8; 第2章&…...

关于部署ELK和EFLK的相关知识

文章目录 一、ELK日志分析系统1、ELK简介1.2 ElasticSearch1.3 Logstash1.4 Kibana&#xff08;展示数据可视化界面&#xff09;1.5 Filebeat 2、使用ELK的原因3、完整日志系统的基本特征4、ELK的工作原理 二、部署ELK日志分析系统1、服务器配置2、关闭防火墙3、ELK ElasticSea…...

实验室信息系统源码 saas模式java+.Net Core版开发的云LIS系统全套源码可二次开发有演示

实验室信息系统源码 saas模式java.Net Core版开发的云LIS系统全套源码可二次开发有演示 一、技术框架 技术架构&#xff1a;Asp.NET CORE 3.1 MVC SQLserver Redis等 开发语言&#xff1a;C# 6.0、JavaScript 前端框架&#xff1a;JQuery、EasyUI、Bootstrap 后端框架&am…...

PCB---Design Entry cis 绘图 导出

修改纸张大小&#xff1a; 画图前准备&#xff1a;导入 画图&#xff1a; 习惯&#xff1a; 电源朝上 地朝下 配置pbc_footprint编号&#xff1a; 都配置好编号就可以导出了 导出&#xff1a;...

vue 一键更换主题颜色

这里提供简单的实现步骤&#xff0c;具体看自己怎么加到项目中 我展示的是vue2 vue3同理 在 App.vue 添加 入口处直接修改 #app { // 定义的全局修改颜色变量--themeColor:#008cff; } // 组件某些背景颜色需要跟着一起改变&#xff0c;其他也是同理 /deep/ .ant-btn-primar…...

D26: 向下负责——保护团队免受 AI 焦虑影响

文章目录 D26: 向下负责——保护团队免受 AI 焦虑影响 🎯 为什么这个话题重要? 现实痛点:团队 AI 焦虑的三种表现 一个真实场景 一、理解 AI 焦虑的本质 1.1 焦虑从何而来? 1.2 焦虑的恶性循环 1.3 一个心理学视角 二、建立团队心理安全网 2.1 心理安全:团队韧性的基石 2…...

观察Taotoken在多模型同时高并发调用下的服务表现

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 观察Taotoken在多模型同时高并发调用下的服务表现 在构建依赖大模型能力的应用时&#xff0c;一个常见的工程挑战是如何应对突发的…...

安达发|自动排单软件:破工程机械困局,助智能制造升级

安达发APS高级生产计划智能排产排程自动排单软件系统推荐_MES 在工程机械制造领域&#xff0c;挖掘机、起重机、混凝土泵车等产品结构复杂&#xff0c;一台设备涉及成千上万个零部件&#xff0c;订单个性化程度高、生产周期长&#xff0c;生产排单一度成为困扰企业发展的核心痛…...

AI模型Docker镜像构建指南:从环境封装到生产部署

1. 项目概述&#xff1a;一个AI模型镜像的诞生与价值最近在开发者社区里&#xff0c;看到不少朋友在讨论一个名为xianyu110/claude4.5的镜像。乍一看这个标题&#xff0c;很多刚接触的朋友可能会有点懵&#xff1a;这到底是啥&#xff1f;是一个新的开源项目&#xff0c;还是一…...

靠谱的工程防火门公司推荐工程防火门

在工程行业摸爬滚打十几年&#xff0c;我见过太多因防火门翻车的项目&#xff1a;验收反复返工、产品用了两三年就变形卡死、超大门洞找不到厂家定制…… 这些看似鸡毛蒜皮的小事&#xff0c;一旦卡到消防验收节点上&#xff0c;轻则赔钱延期&#xff0c;重则被责令停工整改。今…...

深耕区域数字生态,智森传媒赋能本地中小企业破局增长

在本地生活流量红利消退、行业内卷加剧的当下&#xff0c;中小企业数字化转型已不是选择题&#xff0c;而是生存题。十堰智森网络传媒立足本土市场&#xff0c;以技术研发为根基&#xff0c;以区域获客为核心&#xff0c;以数字人直播为抓手&#xff0c;为中小企业搭建全链路数…...

飞书文档批量导出工具:25分钟搞定700+文档的迁移难题

飞书文档批量导出工具&#xff1a;25分钟搞定700文档的迁移难题 【免费下载链接】feishu-doc-export 飞书文档导出服务 项目地址: https://gitcode.com/gh_mirrors/fe/feishu-doc-export 当企业需要切换办公平台或进行数据备份时&#xff0c;飞书文档的批量迁移常常成为…...

为Odoo ERP构建安全的AI数据访问层:基于权限治理的语义查询实践

1. 项目概述&#xff1a;为Odoo ERP构建一个受治理的AI数据访问层如果你正在使用Odoo管理企业业务&#xff0c;同时又希望让AI助手&#xff08;比如Claude、Cursor&#xff09;能够安全地查询销售数据、分析库存状况&#xff0c;而不是让它们直接面对你的生产数据库写SQL&#…...

Simplefolio构建优化终极指南:Tree Shaking与代码分割实战

Simplefolio构建优化终极指南&#xff1a;Tree Shaking与代码分割实战 【免费下载链接】simplefolio ⚡️ A minimal portfolio template for Developers 项目地址: https://gitcode.com/gh_mirrors/si/simplefolio Simplefolio是一个为开发者设计的极简个人作品集模板&…...

【C++ 多态】虚函数 · 虚表 · 重写,一篇彻底弄明白!

C 多态详解 C多态是面向对象的核心灵魂&#xff0c;本文将由浅入深&#xff0c;带你循序渐进地掌握多态的方方面面&#xff0c;全程干货&#xff0c;坐稳发车~ ദ്ദി˶&#xff70;̀֊&#xff70;́ )✧ 文章目录C 多态详解1. 什么是多态&#xff1f;2. 运行时多态的实现前…...