类与对象(3)

news2024/11/17 21:37:04

1.首先我们先介绍一下 赋值重载

我们来举个例子来实现一下
 赋值重载也叫赋值拷贝 
	void operator=(const Date& d)
	{//赋值拷贝 是拷贝给一个已经赋值好的对象 也叫赋值重载
		cout << "赋值重载" << endl;
		year = d.year;
		month = d.month;
		day = d.day;
		
	}

如果我们想要拷贝函数连续拷贝,那我们肯定要返回一个类,这样才能两两一组逐个进行连续拷贝

class Date
{
public:
  Date(int _year , int _month , int _day )
{
	year = _year;
	month = _month;
	day = _day;
}
  /.....
 private:
  int year;
  int month;
  int day;
};
int main()
{ 
   Date d1(2024,07,01);
   Date d2,d3;
   d3=d2=d1;
   
}

就像上面这样的,我们d1先给d2拷贝赋值,接着就如果没有任何返回那么,将无法对d3进行再调用拷贝函数,所以我们返回也得是一个类,既然d2已经被拷贝成功,那我们直接返回d2就可以,也就是*this。当然可以返回d ,前提是有写好的拷贝函

class Date
{
public:
  Date(int _year , int _month , int _day )
{
	year = _year;
	month = _month;
	day = _day;
}

  Date operator=(const Date& d)
	{
         if(this!=d)
       {
		cout << "赋值重载" << endl;
		year = d.year;
		month = d.month;
		day = d.day;
       } return *this;
	}
  /.....
 private:
  int year;
  int month;
  int day;
};
int main()
{ 
   Date d1(2024,07,01);
   Date d2,d3;
   d3=d2=d1;
   
}

 2.传值返回和引用返回

Date& func()
{ 
	//如果是静态的
//	static Date d;
	Date d;
	return d;
}
Date func()
{
	Date d;
	
	return d;
}

首先我们要看这两个返回,如果是第一个引用返回,返回的是d的引用,相当于返回d的别名,那么请问我们出了这个函数,我们的d还存在吗? 当然是不存在的,它的生命周期结束了,空间已经还回操作系统了,所以返回d的引用是不可以的,除非是在静态区上

其次我们看下面这个,为什么返回这个可以呢,因为传值返回是返回 它的拷贝的临时对象,就是d要先调用一下拷贝构造,然后接着呢,再把拷贝好的临时对象返回去,然后函数结束,析构函数释放d。

!:但是如果可以的情况下进行是用引用返回,可以减少很多戏的不必要的临时对象的拷贝;

int main()
{
	Date d1(2024, 6, 27);//默认构造
	Date d2 = d1;//拷贝构造
	Date d3(2024, 6, 28);
	d1 = d3;//赋值重载 赋值拷贝
	Date d4;
	d4 = d1 = d3;//赋值重载
	return 0;
}

!:赋值拷贝和拷贝构造的区别就是 赋值拷贝是给已经赋值好的一个对象再拷贝赋值

       拷贝构造是给一个没有赋值的对象进行拷贝赋值。

我们可以借助上面的代码观察一下传值返回和引用返回的差异

因为我们每次调用赋值重载的话,如果不是引用就每次调用完赋值重载的话,返回就是一个临时对象,就要拷贝一下,每次多拷贝的,每次都要析构函数的调用。

3.运算符重载

函数名字为:关键字operator后面接需要重载的运算符符号

函数原型:返回值类型 operator操作符(参数列表)

注意:
不能通过连接其他符号来创建新的操作符:比如operator@
重载操作符必须有一个类类型参数
用于内置类型的运算符,其含义不能改变,例如:内置的整型+,不 能改变其含义
作为类成员函数重载时,其形参看起来比操作数数目少1,因为成员函数的第一个参数为隐
藏的this
.* :: sizeof ?: . 这五个不能被重载
(1)运算符重载在类里面定义,可以更好的封装管理
(2) 为什么要赋值运算符重载在类里面
赋值运算如果不显示写的话,系统会默认生成一个,容易引起冲突
(3)系统默认生成的赋值运算重载,以值的方式按字节拷贝
我们实现一下Date里面的+=,+和++(前置和后置)
实现+=的话那就是考虑我们加上一个日期对于月份和年的影响
	int GetMonthDay(int year, int month)//因为重复调用多次,所以写在声明的地方,声明的函数就是内敛函数方便调用
	{
		assert(month > 0 && month < 13);		int arr[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;
		}
		else
		{
			return arr[month];
		}
	}
Date& Date::operator+=(int _day)
{
	if (_day < 0)
	{
		return *this -= -_day;
	}
	day += _day;
	while (day > GetMonthDay(year, month))
	{
		day -= GetMonthDay(year, month);
		month++;
		if (month > 12)
		{
			year++;
			month = 1;
		}
		
	}
	return *this;
}

实现+的话是什么情况呢,就是加上一个日期,返回新的日期,但自身的值不变,那我们就可以用一个临时变量进行计算,返回临时变量,自身的值不变

Date Date::operator+(int _day)
{
	Date d1 = *this;
	d1 += _day;
	return d1;
}

用了一下c++里面的复用

!:值得注意的是我们的+=用的引用返回,但是+用的就是传值返回,+=的对象一直在类里面没有因为+=函数结束而销毁,所以用引用返回没问题,但是我们+用的是一个局部变量,会销毁,但是如果传值返回我们会形成一个临时对象的拷贝,所以我们防止计算出的结果的销毁,用传值返回,保证值的成功返回。

接着前置++和后置++在c++里面有一个区分

Date& Date:: operator++()//前置++
{
	*this += 1;
	return *this;
}
Date Date::operator++(int)//后置++
{
	Date d1(*this);
	*this += 1;
	return d1;
}

运算符重载,用一个传值的个数区分。

5 const成员函数

我们发现对Print函数竟然调不动,这是为什么呢?就是因为在类的成员函数里面 默认的情况是

Date* const this 是对this进行了const的管理,但我们d1是const Date* const this此时的调用是权限的放大,所以不可以,我们只要按照规定,给Print函数加上对应的const就可以了。

c++的规定是 

这样就可以了。

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

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

相关文章

Linux 高级编程——线程控制

线程控制&#xff1a;互斥与同步 概念&#xff1a; 互斥 》在多线程中对临界资源的排他性访问。 互斥机制 》互斥锁 》保证临界资源的 访问控制。 pthread_mutex_t mutex; 互斥锁类型 互斥锁变量 内核对象 框架&#xff1a; 定义互斥锁 》初始化锁 》加…

uniapp中如何进行微信小程序的分包

思路&#xff1a;在uniapp中对微信小程序进行分包&#xff0c;和原生微信小程序进行分包的操作基本上没区别&#xff0c;主要就是在pages.json中进行配置。 如图&#xff0c;我新增了一个包diver-page 此时需要在pages.json中的subPackages数组中新增一项 root代表这个包的根…

“论单元测试方法及应用”精选范文,软考高级论文,系统架构设计师论文

论文真题 1、概要叙述你参与管理和开发的软件项目,以吸你所担的主要工作。 2、结给你参与管理和开发的软件项目&#xff0c;简要叙述单元测试中静态测试和动态测试方法的基本内容。 3、结给你惨与管理和研发的软件项目,体阐述在玩测试过程中,如何确定白盒测试的覆盖标准,及如…

Sourcecodester Fantastic Blog CMS v1.0 SQL 注入漏洞(CVE-2022-28512)

前言 CVE-2022-28512 是一个存在于 Sourcecodester Fantastic Blog CMS v1.0 中的 SQL 注入漏洞。攻击者可以通过 "/fantasticblog/single.php" 中的 id 参数注入恶意 SQL 查询&#xff0c;从而获得对数据库的未经授权的访问和控制。 漏洞详细信息 漏洞描述: 该漏…

QML学习——Qt Quick Extras Examples 1.4(八)

Qt Quick Extras Examples 阅读官方的源码然后尝试做了下 01 A car dashboard 样例演示&#xff1a; 说明&#xff1a; ValueSource组件控制数值相关的动画&#xff0c;例如图中数值的变化&#xff1b;TurnIndicator组件是控制左右方向灯的闪烁和背景&#xff0c;里面使用…

深入解析HDFS:定义、架构、原理、应用场景及常用命令

引言 Hadoop分布式文件系统&#xff08;HDFS&#xff0c;Hadoop Distributed File System&#xff09;是Hadoop框架的核心组件之一&#xff0c;它提供了高可靠性、高可用性和高吞吐量的大规模数据存储和管理能力。本文将从HDFS的定义、架构、工作原理、应用场景以及常用…

【Kotlin】Kotlin 基础语法指南

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌…

vue项目手机录音

手机实现录音功能&#xff0c;安卓和苹果都可。功能&#xff0c;点击开始录制录音后&#xff0c;随时可以停止录音&#xff0c;如果不点击停止最多录制15秒。 页面结构 <!--音频--> <div class"audio-box"><audio id"audioPlayer"controlsc…

excel修改批量一列单价的金额并保留1位小数

1.打开表格&#xff0c;要把单价金额变成现在的两倍&#xff0c;数据如下&#xff1a; 2.把单价这一列粘贴到一个新的sheet页面&#xff0c;在B2单元格输入公式&#xff1a;A2*2 然后按enter回车键,这时候吧鼠标放到B2单元格右下角&#xff0c;会出现一个黑色的小加号&#xf…

泰国火出圈的slots游戏联动本土网盟广告推广优势

泰国火出圈的slots游戏联动本土网盟广告推广优势 在泰国&#xff0c;Slots游戏凭借其独特的魅力和吸引力&#xff0c;迅速成为玩家们的热门选择。然而&#xff0c;要在竞争激烈的市场中脱颖而出&#xff0c;推广策略显得尤为重要。本土网盟广告以其独特的优势&#xff0c;为Sl…

制氢厂氢气泄漏安全监测:氢气传感器守护“氢”安全

随着全球能源结构的转型和清洁能源的需求日益增长&#xff0c;氢能作为一种高效、清洁的能源载体&#xff0c;受到了广泛关注。制氢厂作为氢能产业的重要组成部分&#xff0c;其安全问题也日益凸显。在制氢过程中&#xff0c;氢气泄漏是潜在的安全隐患之一&#xff0c;因此&…

数据结构/作业/2024/7/11

1.在堆区申请两个长度为32的空间&#xff0c;实现两个字符串的比较【非库函数实现】 #include <stdio.h> #include <stdlib.h> void input(char*p); void my_strcmp(char *p1,char *p2); int main(int argc, const char *argv[]) {//申请内存空间32个字节 char *p…

vue3 elementplus Springboot 课程购买系统案例源码

系统演示 项目获取地址 Springboot vue3 elementplus 课程购买系统案例源码 附带系统演示&#xff0c;环境搭建教程,开发工具 技术栈:SpringBoot Vue3 ElementPlus MybatisPlus 开发工具:idea 后端构建工具:Maven 前端构建工具:vite 运行环境:Windows Jdk版本:1.8 Nod…

javaweb(四)——过滤器与监听器

文章目录 过滤器Filter基本概念滤波器的分类: 时域和频域表示滤波器类型1. 低通滤波器(Low-Pass Filter)2. 高通滤波器(High-Pass Filter)3. 带通滤波器(Band-Pass Filter)4. 带阻滤波器(Band-Stop Filter) 滤波器参数1. 通带频率(Passband Frequency)2. 截止频率(Cutoff Frequ…

Cesium与Three相机同步(3)

Cesium与Three融合的案例demo <!DOCTYPE html> <html lang"en" class"dark"><head><meta charset"UTF-8"><link rel"icon" href"/favicon.ico"><meta name"viewport" content&q…

【论文阅读】-- M4:面向可视化的时间序列数据聚合

M4: A Visualization-Oriented Time Series Data Aggregation 摘要1 引言2. 查询重写3.时间序列可视化4. 数据缩减运算符4.1 面向可视化的数据聚合4.2 M4聚合4.3 聚合相关的像素错误4.4 M4 上限 5. 时间序列数据缩减6. 评估6.1 真实世界时间序列数据6.2 查询执行性能6.3 可视化…

ByLabel标签打印系统有人用过吗,哪些打小票的软件比较方便?热敏打印机

刚接触小票机热敏打印机ZDesigner ZD888-203dpi ZPL&#xff0c;看网上的说明是要用ZPL打印机协议&#xff0c;一时学不会。 看一个小票机个子小小的&#xff0c;费用要一二千元&#xff0c;外国人真会赚钱。 斑马打印机&#xff0c;网上说的是中文要转换成图片&#xff0c;或者…

ChatGPT 官方发布桌面端,向所有用户免费开放

Open AI 官方已经发布了适用于 macOS 的 ChatGPT 桌面端应用。 此前&#xff0c;该应用一直处于测试阶段&#xff0c;仅 Plus 付费订阅用户可以使用。 目前已面向所有用户开放&#xff0c;所有 Mac 用户均可免费下载使用。 我们可以访问官网下载安装包&#xff1a;https://op…

【netty系列-04】反应堆模式的种类和具体实现

Netty系列整体栏目 内容链接地址【一】深入理解网络通信基本原理和tcp/ip协议https://zhenghuisheng.blog.csdn.net/article/details/136359640【二】深入理解Socket本质和BIOhttps://zhenghuisheng.blog.csdn.net/article/details/136549478【三】深入理解NIO的基本原理和底层…

Node端使用工作线程来解决日志开销-处理IO密集型任务

我们的BBF层很多时候会作为中间层处理后端到前端的数据&#xff0c;当然大部分时候都只是作为请求 / 响应的数据组装中心&#xff0c;但是有一个插件是怎么都绕不过去的&#xff1a;Log4js。 内部我们在Node层打印了很多日志。结果这周仔细分析了一下服务器处理请求到响应的中间…