学习笔记(C++篇)--- Day 4

目录

1.赋值运算符重载

1.1 运算符重载

1.2 赋值运算符重载

1.3 日期类实现 


1.赋值运算符重载

1.1 运算符重载

①当运算符被用于类类型的对象时,C++语言允许我们通过通过运算符重载的形式指定新的含义。C++规定类类型对象使用运算符时,必须转换成调用对应运算符重载,若没有对应的运算符重载,则会编译报错。

②运算符重载是具有特殊名字的函数,他的名字是由 operator 和后面要定义的运算符共同构成。和其他函数一样,它也具有其返回类型和参数列表以及函数体。

③重载运算符函数的参数个数和该运算符作用的运算对象数量一样多。一元运算符有一个参数,二元运算符有两个参数,二元运算符的左侧运算对象传给第一个参数,右侧运算对象传给第二个参数。

④如果一个重载运算符函数是成员函数,则它的第一个运算对象默认传给隐式的 this 指针,因此运算符重载作为成员函数时,参数比运算对象少一个。

⑤运算符重载以后,其优先级和结合性与对应的内置类型运算符保持一致。

⑥不能通过连接语法中没有的符号来创建新的操作符:比如 operator@

.*  ::  sizeof  ?:  . 注意以上5个运算符不能重载。

⑧重载操作符至少有一个类类型参数,不能通过运算符重载改变内置类型对象的含义,如: int operator+(int x, int y)

⑨一个类需要重载哪些运算符,是看哪些运算符重载后有意义;重载++运算符时,有前置++和后置++,运算符重载函数名都是 operator++,无法很好的区分。C++规定,后置++重载时,增加一个 int 形参,跟前置++构成函数重载,方便区分。

⑩重载 << 和 >> 时,需要重载为全局函数,因为重载为成员函数,this 指针默认抢占了第一个形参位置,第一个形参位置是左侧运算对象,调用时就变成了 对象 <<cout,不符合使用习惯和可读性。重载为全局函数把 ostream/istream 放到第一个形参位置就可以了,第二个形参位置当类类型对象。

Date 比较大小的代码示例:

class Date {
public:Date(int year = 1, int month = 1, int day = 1) {_year = year;_month = month;_day = day;}//private:int _year;int _month;int _day;
};bool operator<(const Date& x1, const Date& x2)
{if (x1._year < x2._year){return true;}else if (x1._year == x2._year && x1._month < x2._month){return true;}else if (x1._year == x2._year&& x1._month == x2._month&& x1._day == x2._day){return true;}return false;
}int main()
{Date d1(2024, 8, 9);Date d2(2024, 8, 10);//bool ret2 = d1 < d2;bool ret2 = operator<(d1, d2);return 0;
}

1.2 赋值运算符重载

赋值运算符重载是一个默认成员函数,用于完成两个已经存在的对象直接的拷贝赋值,

这里要注意跟拷贝构造区分,拷贝构造用于一个对象拷贝初始化给另一个要创建的对象。

如以下的例子: 

int main()
{Date d1(2024, 8, 10);Date d2(d1);Date d3(2024, 9, 11);Date d4 = d1;//拷贝构造d1 = d3;	 //赋值运算符重载return 0;
}

特点:

①赋值运算符重载是一个运算符重载,规定必须重载为成员函数

赋值运算符重载的参数建议写成 const 当前类类型引用,否则会传值传参会有拷贝。

②有返回值,且建议写成当前类类型引用,引用返回可以提高效率,有返回值是为了支持连续赋值场景。 

③没有显式实现时,编译器会自动生成一个默认赋值运算符重载,默认赋值运算符重载行为跟默认拷贝函数类似。(栈需要自己实现深拷贝)

Date  和  MyQueue 不需要进行赋值运算符重载,Stack 需要进行赋值运算符重载。

(①构造一般需要自己写,自己传参定义初始化;

   ②析构,构造时有资源申请(如 malloc 或者 fopen)等,就需要显示写析构函数;

   ③拷贝构造和赋值重载,显示写了析构,内部管理资源,就需要显示实现拷贝构造;)

②的示例如下,这样就支持了连续赋值。 

Date& operator = (const Date& d)
{_year = d._year;_month = d._month;_day = d._day;return *this;
}int main()
{d1 = d2 = d3;return 0;
}

 为了防止自己给自己赋值,会进行以下的代码修改:

Date& operator = (const Date& d)
{if (this != &d){_year = d._year;_month = d._month;_day = d._day;}return *this;
}

 对于③,上述的代码屏蔽之后,我们会发现,代码依旧会正常运行。

1.3 日期类实现 

Date.h中的内容:

#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<assert.h>
using namespace std;class Date
{
public:Date(int year = 1900, int month = 1, int day = 1);void Print();int GetMonthDay(int year, int month){assert(month > 0 && month < 13);static int monthDayArray[13] = { -1, 31, 28, 31, 30, 31, 30,
31, 31, 30, 31, 30, 31 };if (month ==2 &&(year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)){return 29;}return monthDayArray[month];}bool operator<(const Date& d);bool operator>(const Date& d);bool operator<=(const Date& d);bool operator>=(const Date& d);bool operator==(const Date& d);bool operator!=(const Date& d);// d1 += 天数Date& operator+=(int day);Date operator+(int day);// d1 -= 天数Date& operator-=(int day);Date operator-(int day);//++d1Date& operator++();//d1++Date operator++(int);//日期减去日期int operator-(const Date& d);
private:int _year;int _month;int _day;
};

 Date.cpp中的内容:

#define _CRT_SECURE_NO_WARNINGS 1
#include"Date.h"Date::Date(int year, int month, int day)
{_year = year;_month = month;_day = day;
}void Date::Print()
{cout << _year << "-" << _month << "-" << "_day" << endl;
}bool Date::operator<(const Date& d)
{if (_year < d._year){return true;}else if (_year == d._year && _month < d._month){return true;}else if (_year == d._year && _month == d._month && _day < d._day){return true;}return false;
}
bool Date::operator>(const Date& d)
{return !(*this <= d);
}
bool Date::operator<=(const Date& d)
{return *this < d || *this == d;
}
bool Date::operator>=(const Date& d)
{return !(*this < d);
}
bool Date::operator==(const Date& d)
{return _year = d._year &&_month == d._month &&_day == d._day;
}
bool Date::operator!=(const Date& d)
{return !(*this == d);
}
//这种不推荐,推荐下面的方法
//Date Date::operator+(int day)
//{
//	Date tmp = *this;
//	tmp._day += day;
//	while (tmp._day > GetMonthDay(tmp._year, tmp._month))
//	{
//		tmp._day -= GetMonthDay(tmp._year, tmp._month);
//		++tmp._month;
//		if (tmp._month == 13)
//		{
//			tmp._year++;
//			tmp._month = 1;
//		}
//	}
//
//	return tmp;
//}
//
//Date& Date::operator+=(int day)
//{
//	*this = *this + day;
//	return *this;
//}Date& Date::operator+=(int day)
{if (day < 0){return *this -= -day;}_day += day;while (_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;
}
Date& Date::operator-=(int day)
{if (day < 0){return *this += -day;}_day -= day;while (_day <= 0){--_month;if (_month == 0){_month = 12;--_year;}_day += GetMonthDay(_year, _month);}return *this;
}
Date Date::operator-(int day)
{Date tmp(*this);tmp -= day;return tmp;
}//++d1
Date& Date::operator++()
{*this += 1;return *this;
}
//d1++
Date Date::operator++(int)
{Date tmp(*this);*this += 1;return tmp;//后置返回++以前的值
}int Date::operator-(const Date& d)
{Date max = *this;Date min = d;int flag = 1;if (*this < d){max = d;min = *this;flag = -1;}int n = 0;while (min != max){++min;++n;}return n * flag;
}

                                                                                                                                                        

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

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

相关文章

Docker 快速入门教程

1. Docker 基本概念 镜像(Image): 只读模板&#xff0c;包含创建容器的指令 容器(Container): 镜像的运行实例 Dockerfile: 用于构建镜像的文本文件 仓库(Repository): 存放镜像的地方&#xff08;如Docker Hub&#xff09; 2. 安装Docker 根据你的操作系统选择安装方式:…

vue项目中使用tinymce富文本编辑器

vue使用tinymce 文章目录 vue使用tinymcetinymce富文本编辑器在这里插入图片描述 一、本文要实现二、使用步骤1.安装tinymce2.tinymce组件新建3. 在store添加商品详情的状态管理4. tinymce组件的引入 tinymce富文本编辑器 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下…

简单适配torch_npu不支持的ATen算子

简单适配torch_npu不支持的ATen算子 一、背景说明1.1 PyTorch扩展机制1.2 核心概念二、实现步骤详解2.1 实现前向、反向传播算子2.2 编译生成动态库2.3 测试验证程序三、关键点解析3.1 设计注意事项3.2 性能优化方向四、验证结果一、背景说明 1.1 PyTorch扩展机制 PrivateUse1…

同样的html标记,不同语言的文本,显示的字体和粗细会不一样吗

同样的 HTML 标记&#xff0c;在不同语言的文本下&#xff0c;显示出来的字体和粗细确实可能会不一样&#xff0c;原因如下&#xff1a; &#x1f30d; 不同语言默认字体不同 浏览器字体回退机制 CSS 里写的字体如果当前系统不支持&#xff0c;就会回退到下一个&#xff0c;比如…

基于 Spring Boot 瑞吉外卖系统开发(六)

基于 Spring Boot 瑞吉外卖系统开发&#xff08;六&#xff09; 菜品列表 在系统管理端首页&#xff0c;单击左侧菜单栏中的“菜品管理”&#xff0c;会在右侧打开菜品管理页面。 请求URL/dish/page&#xff0c;请求方法GET,请求参数page&#xff0c;pageSize。 该菜品列表…

计算机视觉与深度学习 | TensorFlow基本概念与应用场景:MNIST 手写数字识别(附代码)

TensorFlow 基本概念 TensorFlow 是一个开源的机器学习框架,由 Google 开发,核心概念包括: 张量(Tensor):多维数组,是数据的基本单位。计算图(Graph):早期版本中用于描述数据流和计算过程,2.x 默认启用即时执行(Eager Execution),兼顾灵活性和性能。层(Layers)…

vue+django+LSTM微博舆情分析系统 | 深度学习 | 食品安全分析

文章结尾部分有CSDN官方提供的学长 联系方式名片 文章结尾部分有CSDN官方提供的学长 联系方式名片 关注B站&#xff0c;有好处&#xff01; 编号&#xff1a; D031 LSTM 架构&#xff1a;vuedjangoLSTMMySQL 功能&#xff1a; 微博信息爬取、情感分析、基于负面消极内容舆情分析…

RHCE第三次作业 搭建dns的正向解析服务器

server为服务器 client为客户端 设置主配置文件 在server下&#xff1a; [rootServer ~]#vim /etc/named.conf #进入到配置页面&#xff0c;并修改 设置区域文件 [rootServer ~]# vim /etc/named.rfc1912.zones 设置域名解析文件 [rootServer named]# cd /var/named…

Windows 同步技术-一次性初始化

组件通常设计为在首次调用时执行初始化任务&#xff0c;而不是加载它们时。 一次性初始化函数可确保此初始化仅发生一次&#xff0c;即使多个线程可能尝试初始化也是如此。 Windows Server 2003 和 Windows XP&#xff1a; 应用程序必须使用 互锁函数 或其他同步机制提供自己的…

OpenCV 中的角点检测方法详解

文章目录 引言1. Harris角点检测原理1.1 什么是角点&#xff1f;1.2 Harris算法的核心思想1.3 角点、边缘和平坦区域的区分 2. OpenCV实现Harris角点检测3. 总结 引言 在计算机视觉和图像处理中&#xff0c;特征点检测&#xff08;Feature Detection&#xff09;是一个关键任务…

全面介绍AVFilter 的添加和使用

author: hjjdebug date: 2025年 04月 22日 星期二 13:48:19 CST description: 全面介绍AVFilter 的添加和使用 文章目录 1.两个重要的编码思想1. 写代码不再是我们调用别人&#xff0c;而是别人调用我们!2. 面向对象的编程方法. 2. AVFilter 开发流程2.1 编写AVFilter 文件2.1.…

生物计算安全攻防战:从DNA存储破译到碳基芯片防御体系重构

随着碳基生物芯片突破冯诺依曼架构限制&#xff0c;DNA数据存储密度达到1EB/克量级&#xff0c;合成生物学与信息技术的融合正引发新一轮安全革命。本文深入解析碳基芯片逆向工程路径&#xff0c;揭示酶驱动DNA数据解码的技术突破&#xff0c;预警合成生物回路潜在的数据泄露风…

Spring Boot 集成 Ollama API 使用总结

Spring Boot 中集成 Ollama API 的完整指南&#xff0c;涵盖基础配置、API 调用、性能优化及常见问题解决。 一、环境准备 1. 依赖配置 在 pom.xml 中添加必要的依赖&#xff1a; <!-- Spring Web (用于 REST 请求) --> <dependency><groupId>org.springf…

SimVG论文精读

1. 数据集和任务部分 SimVG用的六个数据集&#xff1a;RefCOCO//g, ReferIt, Flickr30K, and GRefCOCO 数据集名称图像数量参照表达式数量参照对象实例数语言特性主要任务RefCOCO19,994142,20950,000​基于 MS COCO 图像&#xff0c;采用 ReferItGame 收集的指代表达数据集。…

VS中回显109:对‘pthread_create’未定义的引用

VS中解决 用VS2022写多线性程时需要使用pthread_create()用于创建线程,即使项目里加了所需要的头文件#include <pthread.h>但编译却报对pthread_create未定义的引用的错误,这是因为没有包含所需要的库 项目右击属性 在库依赖项中添加 pthread Ubuntu中解决 在Ubuntu中…

kotlin与MVVM结合使用总结(一)

一、Kotlin 与 MVVM 结合的核心优势 代码简洁性 数据类&#xff08;data class&#xff09;简化 Model 层定义&#xff0c;自动生成equals/hashCode/toString扩展函数简化 View 层逻辑&#xff08;如点击事件扩展&#xff09;lateinit/by lazy优化 ViewModel 属性初始化 异步处…

视频分析设备平台EasyCVR安防视频小知识:安防监控常见故障精准排查方法

随着安防监控技术的飞速发展&#xff0c;监控系统已经成为现代安防体系中不可或缺的核心组成部分&#xff0c;广泛应用于安防监控、交通管理、工业自动化等多个领域。然而&#xff0c;监控系统的稳定运行高度依赖于设备的正确配置、线路的可靠连接以及电源的稳定供电。在实际应…

【DeepSeek 学习推理】Llumnix: Dynamic Scheduling for Large Language Model Serving实验部分

6.1 实验设置 测试平台。我们使用阿里云上的16-GPU集群&#xff08;包含4个GPU虚拟机&#xff0c;类型为ecs.gn7i-c32g1.32xlarge&#xff09;。每台虚拟机配备4个NVIDIA A10&#xff08;24 GB&#xff09;GPU&#xff08;通过PCI-e 4.0连接&#xff09;、128个vCPU、752 GB内…

如何利用深度学习进行交通流量预测与疏导

传统的交通管理方法&#xff0c;诸如固定的信号灯配时方案、基于经验的警力部署等&#xff0c;在面对现代城市如此复杂多变的交通状况时&#xff0c;已然显得捉襟见肘&#xff0c;难以满足高效交通管理的需求。 在此背景下&#xff0c;准确的交通流量预测便成为了破解交通拥堵难…

LSTM-GAN生成数据技术

1. 项目概述 本项目利用生成对抗网络&#xff08;GAN&#xff09;技术来填补时间序列数据中的缺失值。项目实现了两种不同的GAN模型&#xff1a;基于LSTM的GAN&#xff08;LSTM-GAN&#xff09;和基于多层感知机的GAN&#xff08;MLP-GAN&#xff09;&#xff0c;并对两种模型…