类和对象(2)之类的6个默认成员函数(2)

在这里插入图片描述
上次我们梳理了初始化和清理的知识点,今天我们要梳理的是拷贝赋值的知识点。

拷贝构造函数

看到拷贝构造函数这个名字就能看的出来它是一个构造函数,所以它的语法和构造函数很相似。
既然他是一个构造函数,那么他就具有构造函数的语法,这里我们就不在赘述了。

特征

1.拷贝构造函数只有一个形参,该形参用const修饰,且必须是引用,可以自动调用

提问:为什么必须是引用?
在c++规定中,传值传参必须要调用拷贝构造。所以当你Date(Date d);是传值传参,那么就会先去调用拷贝构造,然后你的Date(Date d);就是拷贝构造,又会调用,然后继续调用拷贝构造,就会陷入一个死循环。(这里编译器直接不会编译通过,防止出现死递归)
在这里插入图片描述

2.编译器会自动生成拷贝构造函数,并且会处理内置类型,如果是自定义类型会去调用自定义类型中的拷贝构造函数。
注:浅拷贝可以用,深拷贝不能用!

#include<iostream>
using namespace std;
class Date
{
public:Date(int year=1, int month=1, int day=1){_year = year;_month = month;_day = day;}/*Date(const Date& d){this->_day = d._day;this->_month = d._month;this->_year = d._year;}*/void Print(){cout << _year << "-" << _month << "-" << _day << endl;}
private:int _year;int _month;int _day;
};
int main()
{Date d1(2024,1,29);Date d2(d1);d1.Print();d2.Print();return 0;
}

在这里插入图片描述
上述代码可见,我已经将我写的拷贝构造函数屏蔽,但是运行结果依然拷贝成功,证明编译器自动生成的拷贝构造函数是会处理的

3.用同类型对象初始化要创建的对象。

赋值重载

运算符重载

格式: operator + 运算符号

规定
1.重载操作符必须有一个类类型的(自定义)参数
2.用于内置类型的运算符,其含义不能改变,例如:内置的整型+,不 能改变其含义
3.作为类成员函数重载时,其形参看起来比操作数数目少1,因为成员函数的第一个参数为隐藏的this。
4. .* :: sizeof ?: . 注意以上5个运算符不能重载。

#include<iostream>
using namespace std;
class Date
{
public:Date(int year=1, int month=1, int day=1){_year = year;_month = month;_day = day;}bool operator < (const Date& d){if (this->_year < d._year){return true;}else  if(this->_year == d._year){if (this->_month < d._month){return true;}else if (this->_month == d._month){if (this->_day < d._day){return true;}}}return false;}void Print(){cout << _year << "-" << _month << "-" << _day << endl;}
private:int _year;int _month;int _day;
};
int main()
{Date d1(2024, 1, 29);Date d2(2024, 1, 28);cout << (d1 < d2) << endl;return 0;
}

在这里插入图片描述
会发现返回的是0,也就是说大于。

赋值重载

赋值重载就是将赋值运算符进行重载。两个已经存在的对象,一个拷贝赋值给另一个。(这里要与拷贝构造函数进行区分,一个是用同类型对象初始化要创建的对象,一个是两个已经存在的对象。)

1.多个类类型进行复制需要有返回值且返回值需要加&(引用)。
2.赋值重载会自动生成,且也会对内置类型处理。(深拷贝还是需要自己写!)
3.复制重载不能重载成全局函数!!!

#include<iostream>
using namespace std;
class Date
{
public:Date(int year=1, int month=1, int day=1){_year = year;_month = month;_day = day;//d1=d2Date& operator= (const Date& d){this->_day = d._day;this->_month = d._month;this->_year = d._year;return *this;}void Print(){cout << _year << "-" << _month << "-" << _day << endl;}
private:int _year;int _month;int _day;
};
int main()
{Date d1;Date d2;Date d3(2024, 1, 29);d1 = d2 = d3;return 0;
}

在这里插入图片描述
原因是因为连续赋值是从右向左开始的,也就是说从d2=d3开始,需要有返回值在赋值给d1,所以这个时候我们需要加引用。

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

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

相关文章

二手交易|校园二手交易小程序|基于微信小程序的闲置物品交易平台设计与实现(源码+数据库+文档)

校园二手交易小程序目录 目录 基于微信小程序的闲置物品交易平台设计与实现 一、前言 二、系统功能设计 三、系统实现 1、用户信息管理 2、商品信息管理 3、公告信息管理 4、论坛信息管理 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计算机毕…

响应式Web开发项目教程(HTML5+CSS3+Bootstrap)第2版 例5-4 Document

代码 <!doctype html> <html> <head> <meta charset"utf-8"> <title>Document</title> </head><body> <canvas id"cavsElem" width"400" height"600">您的浏览器不支持Canvas…

如何实现Win系统ssh连接Ubuntu使用vscode远程敲代码

最近&#xff0c;我发现了一个超级强大的人工智能学习网站。它以通俗易懂的方式呈现复杂的概念&#xff0c;而且内容风趣幽默。我觉得它对大家可能会有所帮助&#xff0c;所以我在此分享。点击这里跳转到网站。 文章目录 前言1、安装OpenSSH2、vscode配置ssh3. 局域网测试连接…

Android Settings 按住电源按钮

如题&#xff0c;Android 原生 Settings 里有个 按住电源按钮 的选项&#xff0c;可以设置按住电源按钮的操作。 按住电源按钮 两个选项的 UI 是分离的&#xff0c; 电源菜单 代码在 packages/apps/Settings/src/com/android/settings/gestures/LongPressPowerForPowerMen…

存储技术架构演进

一. 演进过程 存储技术架构的演进主要是从集中式到分布式的一种呈现&#xff0c;集中式存储模式凭借其在稳定性和可靠性方面的优势成为许多业务数据库的数据存储首选&#xff0c;顾名思义&#xff0c;集中式存储主要体现在集中性&#xff0c;一套集中式管理的存储系统&#xff…

SpringBoot项目配置SSL后,WebSocket连接失败的解决方案

SpringBoot项目配置SSL后&#xff0c;WebSocket连接应使用wss协议&#xff0c;而不是ws协议。在前端配置WebSocket时&#xff0c;URL以wss://开头。

基于springboot的房屋交易系统

文章目录 项目介绍主要功能截图&#xff1a;部分代码展示设计总结项目获取方式 &#x1f345; 作者主页&#xff1a;超级无敌暴龙战士塔塔开 &#x1f345; 简介&#xff1a;Java领域优质创作者&#x1f3c6;、 简历模板、学习资料、面试题库【关注我&#xff0c;都给你】 &…

批量修改图斑起始点为左上角节点(顺时针方向排列),其他方位的起始点在本案例基础上微调即可实现

目录 一、实现效果 二、实现过程 1.修改图斑节点方向 2.获取图斑左上角节点 3.重新计算图斑节点顺序 4.修改图斑的起始点到左上角 5.模板的使用 三、总结 使用FME对图斑进行批量起始点修改&#xff0c;将起始点修改到图斑的左上角&#xff0c;并且节点方向统一为顺时针…

处理Servlet生命周期事件

处理Servlet生命周期事件 接收关于 Servlet生命周期事件通知的类称为事件侦听器。这些侦听器实现Servlet API中定义的一个或多个servlet事件侦听器接口。侦听器类的逻辑分类如下: servlet请求侦听器Servlet上下文侦听器HTTP会话侦听器1. servlet请求侦听器 servlet请求侦听器…

基于springboot药房管理系统源码和论文

伴随着全球信息化发展&#xff0c;行行业业都与计算机技术相衔接&#xff0c;计算机技术普遍运用于药房管理行业。实施计算机系统来管理可以降低逍遥大药房管理成本&#xff0c;使整个逍遥大药房行业的发展有显著提升。 本论文主要面向逍遥大药房管理中出现的一些常见问题&…

Java基础数据结构之哈希表

概念 顺序结构以及平衡树 中&#xff0c;元素关键码与其存储位置之间没有对应的关系&#xff0c;因此在 查找一个元素时&#xff0c;必须要经过关键 码的多次比较 。 顺序查找时间复杂度为 O(N) &#xff0c;平衡树中为树的高度&#xff0c;即 O( log2N ) &#xff0c;搜索的效…

IndexedDB查询

Indexeddb 创建、增删改查_indexdb 删除表-CSDN博客本地数据库IndexedDB - 学员管理系统之条件筛选&#xff08;四&#xff09;_indexdb条件查询-CSDN博客 <div align"center"><input type"text" id"input_search"> <button id&q…