【C++课程学习】:类和对象(拷贝构造和运算符重载)

🎁个人主页:我们的五年

🔍系列专栏:C++课程学习

🎉欢迎大家点赞👍评论📝收藏⭐文章

 

目录

✍拷贝构造:

🍉特点一:

🍉特点二:

🍉特点三:

🍉特点四:

拷贝构造函数三种调用场景:

✍运算符重载:

🍭赋值运算符重载:

🍭前置++和后置++的重载:


 

前言:

前面已经学过默认成员函数,但是只讲了构造函数和析构函数。这篇文章就来讲一讲剩下的两个默认成员函数:拷贝构造函数和赋值运算符重载。

拷贝构造函数也是属于构造函数的,只是拷贝构造是用另外一个对象里的数据给新创建的对象赋值。

✍拷贝构造:

拷贝构造:

拷贝构造只有一个和要创建的对象同类型的参数的引用,而且一般用const修饰,因为这个参数只要读取权限就可以了。因为他属于构造函数,所以我们传参时满足这一特点,编译器就会调用这个构造函数。

🍉特点一:

拷贝构造是构造函数的一种重载形式。


🍉特点二:

拷贝构造的参数只有一个,并且一定要是同类型的对象的引用。

比如:

Data (const Data& d){

        ……

}


🍉特点三:

如果是传值拷贝构造,那么就会发生无穷递归。

看看下面的错误示范:

#include<iostream>
using namespace std;class Data {
public:Data(int year, int month, int day) {_year = year;_month = month;_day = day;}Data(const Data d) {//……}
private:int _year=1;int _month=1;int _day=1;
};
int main()
{Data a(2024,6,11);Data b(a);return 0;
}

●b实例化的时候,就会去调用拷贝构造,然后把实参a传给形参d.

●但是传值要进行拷贝,调用d拷贝构造,把a拷贝给d。

●差不多每次传给另外一个参数,就要调用一次拷贝构造,这样就会一直重复下去。


🍉特点四:

如果我们不显式实现,因为也是属于默认成员函数,所以编译器会自己生成。编译器会自己生成,编译器自己生成的拷贝构造函数是按内存存储按字节序列进行拷贝的。这种拷贝叫浅拷贝,或者值拷贝。因为如果类的成员有的是指针,那也是拷贝同样的指针,这样是不行的。

自定义类型就是调用它的拷贝构造函数。

总结:

如果一个类有空间申请,那么一定要显式自己写拷贝构造函数。如果没有资源的清理,那么编译器生成的也是可以的。比如日期类就不要显式实现。

拷贝构造函数三种调用场景:

1.在创建新的对象的时候,参数是同类型对象的引用。

2.在传值传参的时候,也是要调用拷贝构造函数的。

3.当类类型作为返回值的时候,也是要调用拷贝构造函数的。

从上面的三种场景来看,日常我们可以不用传值就不要用传值。也就是尽可能的使用传引用,除非特殊情况一定要用传值。

✍运算符重载:

概念:

在类中,为了增强代码的可读性,C++中引入了运算符重载这一概念。因为是重载,所以我们也可以推断出,我们用一样的运算符,但是是不同的类型的时候,就会调用不同的函数。

运算符重载是特殊函数名的函数,有返回类型和参数,返回类型和参数与普通的函数差不多。

●函数名:operator+要重载的运算符。

●原型:返回类型    函数名(参数列表)。

●必须是已存在的运算符才能重载,比如>,<。@这个符号就不能进行运算符重载。

●重载操作符必须有一个类类型的参数。

●虽然看起来形参比操作对象少一个,其实是隐藏了一个this指针,this指针是指向最前面那个操作对象的。

●   .*       sizeof       ::     .     ?:        这五个运算符是不能进行重载的。

🍭赋值运算符重载:

赋值运算符重载的格式:

● 参数类型:const  类型&,传递引用可以提高效率。

●返回类型:类型&(这个类类型的引用),返回引用是为了可以支持连续赋值,比如c=b=a,顺序是,先是a给b赋值,然后返回b,然后在b给c赋值。

●赋值运算符只能重载成类的成员函数,不能重载为全局函数。

因为如果重载为全局函数,这时候在类里面没有显示实现,所以编译器会自己生成一个赋值运算符。这样我们调用赋值的时候,编译器就不知道去调用哪个赋值函数。

●编译器自己生成的赋值运算符,对于内置类型,也是去按内存的字节序进行赋值。对应自定义类型,那么就去调用它的赋值运算符函数。

下面是日期类的显式赋值运算符重载:

#pragma once
#include<iostream>
#include<stdbool.h>
#include<assert.h>
#include<math.h>
using namespace std;
public://全缺省的构造函数Data(int year = 1, int month = 1, int day = 1) {_year = year;_month = month;_day = day;}//拷贝构造函数Data(const Data& d){_year = d._year;_month = d._month;_day = d._day;}//赋值运算符重载Data& operator = (const Data& d) {_year = d._year;_month = d._month;_day = d._day;return *this;
}//析构函数~Data() {_year = -1;_month = -1;_day = -1;}
private:int _year;int _month;int _day;
};

🍭前置++和后置++的重载:

先来说这两个的区别:

1.前置++:调用++函数以后,返回++之的值。

2.前置++:调佣++函数以后,返回++之的值。

因为这两个++的函数名都是operator++,为了构成区分,我们的C++祖师爷在后置++里面放了一个int参数,这样与前置++就可以构成函数重载;

因为前置++可以返回的++以后的值,所以我们++以后,就直接可以用引用返回。

但是后置++,返回的++之前的值,这样我们传值返回。

日期类的前置++和后置++:

#pragma once
#include<iostream>
#include<stdbool.h>
#include<assert.h>
#include<math.h>
using namespace std;class Data {friend ostream& operator<<(ostream& out, Data& d);friend istream& operator>>(istream& in, Data& d);
public://全缺省的构造函数Data(int year = 1, int month = 1, int day = 1) {_year = year;_month = month;_day = day;}//拷贝构造函数Data(const Data& d){_year = d._year;_month = d._month;_day = d._day;}//+=运算符重载Data& operator+=(int day) {if (day < 0){return *this -= -day;}_day += day;while (_day > GetDay(_year,_month)){_day -= GetDay(_year, _month);_month++;if (_month == 13){_month = 1;_year++;}}return *this;}//日期的前置++Data& operator++() {return *this += 1;}//日期的后置++Data operator++(int) {Data a = *this;*this += 1;return a;}Data operator++(int);//析构函数~Data() {_year = -1;_month = -1;_day = -1;}
private:int _year;int _month;int _day;
};

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

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

相关文章

(三十)Flask之wtforms库【剖析源码上篇】

每篇前言&#xff1a; &#x1f3c6;&#x1f3c6;作者介绍&#xff1a;【孤寒者】—CSDN全栈领域优质创作者、HDZ核心组成员、华为云享专家Python全栈领域博主、CSDN原力计划作者 &#x1f525;&#x1f525;本文已收录于Flask框架从入门到实战专栏&#xff1a;《Flask框架从入…

45.Python-web框架-Django - 开始建立第一个项目

目录 1.django是什么&#xff1f; 2.Pycharm 社区版&#xff0c;还是专业版&#xff1f; 3.开始django&#xff0c;Pycharm专业版 创建一个Django项目 运行一个Django项目 运行方法一&#xff0c;命令行的方式 运行方法二&#xff0c;配置Django Server的方式 4.django尊…

gpio-0设置成输出失败的原因

原因 spi驱动先设置gpio-0成了输出&#xff1b; 但是后面其他驱动&#xff0c;使用of_property_read_u32获取设备树节点的属性时&#xff0c;没去判断返回值&#xff1b;而直接使用参数返回的0&#xff0c;导致gpio-0又被设置成了输入 实例 正常的如下&#xff0c;gpio显示…

入职3年-我如何做一名AI产品经理(文末福利)

引言 从2021年校招加入京东开始&#xff0c;我一直从事AI产品经理的工作&#xff0c;有幸见证了AI行业的热情从一台台服务器烧到了全世界各个角落&#xff0c;也见证了京东AI中台团队的影响力如何一步步的扩大。从21年的迷茫到24年的坚定&#xff0c;很庆幸我正走在适合自己的…

【C++】类的默认成员函数

类的默认成员函数 类的六个默认成员函数构造函数构造函数的概念构造函数的特性 析构函数析构函数的概念析构函数的特性 构造函数与析构函数的调用顺序拷贝构造拷贝构造的概念拷贝构造的特性赋值运算符重载运算符重载赋值运算符重载前置与后置重载输入输出流重载 const修饰成员实…

高精度减法

高精度减法 两个高精度整数的减法题目思路实现代码实现 两个任意符号的高精度加减法 两个高精度整数的减法 高精度指的是数字的大小非常非常大&#xff0c;最多能有10的5次方 的 位数。 本次计算的两个数均为 正数&#xff0c;如何求负数会在最后提到。 题目 给定两个正整数…

解决浏览器缩放的时候,重新设置滚动条的位置,使页面滚动条固定悬浮在页面底部

项目场景&#xff1a; 浏览器调试页面兼容页面时&#xff0c;缩放页面宽度&#xff0c;整体超出时滚动条出现在页面最底部&#xff0c;不是悬浮在页面下面&#xff0c;只有滚动到最底部才出现&#xff0c;需要的是悬浮在页面底部&#xff0c;不是滚动到最下面才出现 解决方案…

java面试整合全套

什么是Java &#xff08;定义 优点&#xff09; java是一个平台&#xff0c;由jvm和Java应用编程接口构成的一门面向编程语言。 不仅吸收了C语言的各种优点&#xff0c;还摒弃了c语言里面的多继承,指针等概念&#xff0c;因此java的特征主要有功能强大和简单易用的特征。 jav…

FPGA Verilog模块化设计入门篇一

随着电子技术的快速发展&#xff0c;现场可编程门阵列&#xff08;FPGA&#xff09;已成为现代电子系统设计中不可或缺的一部分。FPGA的灵活性、可重构性和高性能使得它成为处理复杂算法、加速数据处理和实现特定功能的理想选择。然而&#xff0c;随着系统复杂性的增加&#xf…

go-zero整合Excelize并实现Excel导入导出

go-zero整合Excelize并实现Excel导入导出 本教程基于go-zero微服务入门教程&#xff0c;项目工程结构同上一个教程。 本教程主要实现go-zero框架整合Excelize&#xff0c;并暴露接口实现Excel模板下载、Excel导入、Excel导出。 go-zero微服务入门教程&#xff1a;https://blo…

Mysql学习(九)——存储引擎

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 七、存储引擎7.1 MySQL体系结构7.2 存储引擎简介7.3 存储引擎特点7.4 存储引擎选择7.5 总结 七、存储引擎 7.1 MySQL体系结构 连接层&#xff1a;最上层是一些客户…

自然语言处理领域的重大挑战:解码器 Transformer 的局限性

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

聚焦赛宁网安竞赛平台+赛事服务,引领网络安全竞赛新潮流

第八届XCTF总决赛将在2024年6月22日于中国成都震撼开启&#xff0c;本届总决赛分为个人Live Solo和团队KOH巅峰对决两个赛道&#xff0c;从个人和团队多角度全方位考察参赛人员的竞技水平。 巅峰对决 智慧的火花在此碰撞 个人Live Solo赛制 Live Solo赛分为晋级赛和Solo赛。…

贝壳APP渗透测试WP

前期配置 环境说明 使用PIXEL 4手机&#xff0c;为Android 12系统 APP名为贝壳找房&#xff0c;包名com.lianjia.beike&#xff0c;版本号3.01.10&#xff0c;截至2024/05/07为最新版&#xff0c;小米应用市场下载 绕过反Frida机制 可以参考往期推送&#xff0c;《绕过最新…

2分钟用手机开发一个ChatBot

前言&#xff1a; 在上一期&#xff0c;我们测评了CodeFlying&#xff0c;用它开发出了一个复杂推文管理系统&#xff0c;然后体验了一下它的热门应用&#xff1a;AI智能机器人。今天咱就继续用CodeFlying来开发一个属于我们自己的聊天机器人。 老规矩&#xff0c;我们先在手机…

【qt】平面CAD(计算机辅助设计 )项目 上

CAD 一.前言二.界面设计三.提升类四.接受槽函数五.实现图形action1.矩形2.椭圆3.圆形4.三角形5.梯形6.直线7.文本 六.总结 一.前言 用我们上节课刚刚学过的GraphicsView架构来绘制一个可以交互的CAD项目! 效果图: 二.界面设计 添加2个工具栏 需要蔬菜的dd我! 添加action: …

遗传算法求解车间调度问题(附python代码)

背景介绍 车间调度问题&#xff08;Job Shop Scheduling Problem, JSSP&#xff09;是一类经典的组合优化问题&#xff0c;它在制造业和生产管理中有着广泛的应用。JSSP 的目标是对车间中的一系列作业进行排程&#xff0c;以使得作业在不同机器上的加工顺序是最优的&#xff0…

万相台的功能是什么?如何使用万相台?

1.特点&#xff1a; 万相台是一个智能渠道&#xff0c;可控性弱&#xff0c;高转化&#xff0c;人群&关键词是黑盒&#xff1b; 2.场景多&#xff1a; 有拉新快、活动加速、上新快、货品加速、活动加速、多目标直投、全站推等&#xff1b; 3.扣费逻辑&#xff1a;cpc付…

Sm4【国密4加密解密】

当我们开发金融、国企、政府信息系统时&#xff0c;不仅要符合网络安全的等保二级、等保三级&#xff0c;还要求符合国密的安全要求&#xff0c;等保测评已经实行很久了&#xff0c;而国密测评近两年才刚开始。那什么是密码/国密&#xff1f;什么是密评&#xff1f;本文就关于密…

Linux:线程概念 线程控制

Linux&#xff1a;线程概念 & 线程控制 线程概念轻量级进程 LWP页表 线程控制POSIX 线程库 - ptherad线程创建pthread_createpthread_self 线程退出pthread_exitpthread_cancelpthread_joinpthread_detach 线程架构线程与地址空间线程与pthread动态库 线程的优缺点 线程概念…