【C++类和对象】类有哪些默认成员函数呢?(上)
目录
1. 类的6个默认成员函数
2. 构造函数(*^▽^*)
2.1 概念
2.2 特性
3. 析构函数(*^▽^*)
3.1 概念
3.2 特性
4. 拷贝构造函数(*^▽^*)
4.1 概念
4.2 特性
5. 赋值运算符重载(*^▽^*)
5.1 运算符重载
5.2 赋值运算符重载
ヾ(๑╹◡╹)ノ"人总要为过去的懒惰而付出代价!ヾ(๑╹◡╹)ノ"
1. 类的6个默认成员函数
默认成员函数:用户没有显式实现,编译器会生成的成员函数称为默认成员函数。
2. 构造函数(*^▽^*)
2.1 概念
对于data类:
class Date
{
public:void Init(int year, int month, int day){_year = year;_month = month;_day = day;}void Print(){cout << _year << "-" << _month << "-" << _day << endl;}
private:int _year;int _month;int _day;
};
int main()
{Date d1;d1.Init(2022, 7, 5);//初始化d1.Print();Date d2;d2.Init(2022, 7, 6);//初始化d2.Print();return 0;
}
对于上面的这个代码,可以通过 Init 公有方法给对象设置日期,每次创建对象时都调用该方法设置信息。
2.2 特性
class Date
{
public:// 1.无参构造函数Date()//构造函数:函数名与类名相同,无返回值{_year = 1;_month = 1;_day = 1;}// 2.带参构造函数Date(int year, int month, int day){_year = year;_month = month;_day = day;}
private:int _year;int _month;int _day;
};
void TestDate()
{Date d1; // 调用无参构造函数,注意,不能写成Date d1();Date d2(2015, 1, 1); // 调用带参的构造函数// 注意:如果通过无参构造函数创建对象时,对象后面不用跟括号,否则就成了函数声明
}
默认构造函数:(1)无参的构造函数(2)全缺省的构造函数(3)C++编译器生成的无参的构造函数【即三种必须要有一种,如果没有默认的构造函数【写的构造函数不是无参的,也不是全缺省的】就会报错】
如果一个类中的成员全是自定义类型,我们就可以用默认生成的函数。如果有内置类型函数成员,或者需要显示传参初始化,那么都要自己实现构造函数。(需要传参初始化,需要自己实现构造函数)【大部分都是自己写构造函数】
C++编译器默认生成构造函数对内置类型函数成员变量不作处理,自定义类型成员会去调用它自己的默认构造函数。
注意: C++11 中针对内置类型成员不初始化的缺陷,又打了补丁,即: 内置类型成员变量在类中声明时 可以给默认值 。【注意:这里是声明,所以是一个缺省值,并不是初始化】
class Date
{
public:Date()//无参的构造函数{_year = 1900;_month = 1;_day = 1;}Date(int year = 1900, int month = 1, int day = 1)//全缺省的构造函数{_year = year;_month = month;_day = day;}
private:int _year;int _month;int _day;
};void Test()
{Date d1;//这里会发生错误,默认构造函数只能有一个
} 运行时都会发生错误,出现冲突。
一般情况一个C++类,都要自己写构造函数。只有极少数情况下可以让编译器自动生成:
(1)类里面成员都是自定义类型成员, 并且这些成员都提供了默认构造函数。
(2)内置类型成员声明时给出缺省值。
3. 析构函数(*^▽^*)
3.1 概念
3.2 特性
4. 拷贝构造函数(*^▽^*)
4.1 概念

创建对象时,创建一个与一个对象一某一样的新对象。
4.2 特性
1. 拷贝构造函数是构造函数的一个重载形式。
class Date
{
public:Date(int year = 1900, int month = 1, int day = 1){_year = year;_month = month;_day = day;}Date(const Date& d)//拷贝构造函数{_year = d._year;_month = d._month;_day = d._day;}
private:int _year;int _month;int _day;
};
int main()
{Date d1;Date d2(d1);return 0;
}
传值方式:调用拷贝构造会调用拷贝构造函数,调用这个函数需要先传参,传参是一份临时拷贝,此时的状态是临时拷贝对象,相当于又是拷贝构造,又需要调用拷贝构造函数,此时就会引发无穷递归调用。
引用传参:就不会调用拷贝构造。
【一个对象初始化这个类的另一个对象,就是拷贝构造】【进行拷贝对象就是拷贝构造】
自定义类型对象,拷贝初始化要调用拷贝构造完成。
结论:一般的类,自己生成的拷贝构造就够用了,不需要自己写拷贝构造。但是像stack这样的类,直接自己管理资源,就需要自己实现深拷贝。
类中如果没有涉及资源申请时,拷贝构造函数是否写都可以;一旦涉及到资源申请时,则拷贝构造函数是一定要写的,否则就是浅拷贝。
为了提高程序效率,一般对象传参时,尽量使用引用类型,返回时根据实际场景,能用引用尽量使用引用。
5. 赋值运算符重载(*^▽^*)
5.1 运算符重载
//日期的判断是否相等
bool operator==(const Date& d1, const Date& d2)
{return d1._year == d2._year && d1._month == d2._month && d1._day == d2._day;}
//放到类里面 Date,此时是在类外面的写法
//1.
if (operator==(d1, d2))
{cout << "==" << endl;
}
//2/
if (d1 == d2)
{cout << "==" << endl;
}
//1.和2.是等价的,编译器会处理成1.
(1)内置类型是可以直接用各种运算符,但是自定义类型是不可以直接用各种运算法的。为了让自定义类型可以使用各种运算符,所以就有了运算符重载。
(2)有多少个操作数就有多少个函数参数。(==两个操作数;++一个操作数;)
在类里面的写法:
//日期的判断是否相等
bool operator==(const Date& d)
{return _year == d._year&& _month == d._month&& _day == d._day;
}
//放到类里面 Date,此时是在类里面的写法
//1.
if (d1.operator==(d2))
{cout << "==" << endl;
}
//2/
if (d1 == d2)
{cout << "==" << endl;
}
//1.和2.是等价的,编译器会处理成对应重载运算法调用
如果两个代码都存在(编译器是可以通过的,因为符合函数重载),编译器优先使用类里面的运算符重载。
//判断日期小
bool operator<(const Date& d)
{//小的情况if (_year < d._year|| (_year == d._year && _month < d._month)|| (_year == d._year && _month == d._month && _day < d._day)){return true;}else{return false;}
}
这里注意细节,不能想当然。
5.2 赋值运算符重载
1. 参数类型2. 返回值3. 检测是否自己给自己赋值4. 返回 *this5. 一个类如果没有显式定义赋值运算符重载,编译器也会生成一个,完成对象按字节序的值拷贝
//d2 = d1;-> d2.operator(&d2, d1)
Date& operator=(const Date& d)
{if (this != &d){_year = d._year;_month = d._month;_day = d._day;}return *this;
}
int main()
{Date d1(2000, 8, 20);Date d2(2000, 9, 17);Date d3(d1);//拷贝构造,一个存在的对象去初始化另一个要创建的对象d2 = d1;//赋值重载(复制拷贝) 两个已经存在的对象之间赋值
} 补充知识:空指针是不存在的吗?是存在的,空地址是一个存在的地址。
相关文章:
【C++类和对象】类有哪些默认成员函数呢?(上)
目录 1. 类的6个默认成员函数 2. 构造函数(*^▽^*) 2.1 概念 2.2 特性 3. 析构函数(*^▽^*) 3.1 概念 3.2 特性 4. 拷贝构造函数(*^▽^*) 4.1 概念 4.2 特性 5. 赋值运算符重载(*^▽^*) 5.1 运算符重载 5.2 赋值运算符重载 ヾ(๑╹◡╹)ノ"人总要为…...
(docker)mysql镜像拉取-创建容器-容器的使用【个人笔记】
【容器的第一次创建】 容器的第一次创建,需要先下载镜像,从 镜像拉取 0、可以搜索镜像的版本 docker search mysql1、先拉取MySQL的镜像,默认拉取最新版,使用下面的命令拉取mysql镜像 docker pull mysql也可以指定mysql的版本…...
【时间格式引发的事故】
时间格式引发的事故 背景实战演示结论 背景 前不久写了一个删除数据接口,条件是根据时间删除时间后面的数据。入参是 时间字符串。后台的时间格式 是 yyyyMMdd。然后当时前端传参数的时候,随意的传了2023-07-31的时间,然后将该表的数据全部删…...
【数据结构】栈及其实现
目录 1.栈的概念及结构 2.栈的实现 2.1栈结构定义 2.2初始化及销毁 2.3插入数据 2.4删除数据 2.5访问栈顶数据 2.6判断是否为空栈 2.7计算栈的大小 3.8访问栈中所有数据 1.栈的概念及结构 栈:栈是一种特殊的线性表,其只允许在固定的一端进行插…...
Linux命令200例:mount将文件系统挂载到指定目录下(常用)
🏆作者简介,黑夜开发者,全栈领域新星创作者✌。CSDN专家博主,阿里云社区专家博主,2023年6月csdn上海赛道top4。 🏆数年电商行业从业经验,历任核心研发工程师,项目技术负责人。 &…...
互联网摸鱼日报(2023-08-11)
互联网摸鱼日报(2023-08-11) 36氪新闻 年景不稳,市场人活成创始人 石油巨头开始疯抢锂矿,美国也开始讲“锂”了? 公司监控员工键盘 49 天,18 年老员工被解雇:因为“打字不够”? 这不是危言耸听…...
第十五章、【Linux】例行性工作调度
15.1 什么是例行性工作调度 在不考虑硬件与服务器的链接状态下,Linux可以帮助提醒许多任务。Linux调度就是通过crontab与at这两个东西。 15.1.1 Linux工作调度的种类:at,cron 从上面的说明当中,我们可以很清楚的发现两种工作调度的方式&am…...
基于Promise.resolve实现Koa请求队列中间件
本文作者为360奇舞团前端工程师 前言 最近在做一个 AIGC 项目,后端基于 Koa2 实现。其中有一个需求就是调用兄弟业务线服务端 AIGC 能力生成图片。但由于目前兄弟业务线的 AIGC 项目也是处于测试阶段,能够提供的服务器资源有限,当并发请求资源…...
【结构型设计模式】C#设计模式之桥接模式
题目:设计一个桥接模式来实现图形和颜色之间的解耦。 解析: 桥接模式是一种结构型设计模式,它将抽象部分与实现部分分离,使它们可以独立变化。在这个例子中,抽象部分是图形(如圆形、正方形)&am…...
【12】Git工具 协同工作平台使用教程 Gitee使用指南 腾讯工蜂使用指南【Gitee】【腾讯工蜂】【Git】
tips:少量的git安装和使用教程,更多讲快速使用上手Gitee和工蜂平台 一、准备工作 1、下载git Git - Downloads (git-scm.com) 找到对应操作系统,对应版本,对应的位数 下载后根据需求自己安装,然后用git --version验…...
zookeeper增加IP白名单-安全设置
简介: zookeeper未授权访问漏洞,处理这个漏洞最简单,常用的应该就是给zookeeper添加用户名、密码验证,如果项目比较急,且代码不支持zookeeper的用户名、密码验证,那采用ip白名单过滤,无疑是最快…...
Mac 调试 ios safar
1. 打开Mac的 Safari 浏览器的“开发”菜单 运行 Safari 浏览器,然后依次选取“Safari 浏览器”>“偏好设置”,点按“高级”面板,然后勾选“在菜单栏中显示开发菜单”。 2. 开启IPhone的Safari调试模式 启用 Web 检查 功能,打…...
Linu网络服务NFS
linux网络服务NFS 一.NFS简介二.NFS原理三.NFS优势四.配置文件五.NFS共享存储服务的操作步骤 一.NFS简介 NFS(网络文件服务) NFS是一种基于tcp/ip传输的网络文件系统协议,最初由sun公司开放通过使用NFS协议,客户机可以像访问本地…...
24届近5年同济大学自动化考研院校分析
今天给大家带来的是同济大学控制考研分析 满满干货~还不快快点赞收藏 一、同济大学 学校简介 同济大学历史悠久、声誉卓著,是中国最早的国立大学之一,是教育部直属并与上海市共建的全国重点大学。经过115年的发展,同济大学已经…...
多源BFS
多源 超级源点和汇点最短距离[超级汇点]昂贵的聘礼 多源BFS矩阵距离 超级源点和汇点 超级源点跟超级汇点是模拟出来的虚拟点,多用于图中: <1>同时有多个汇点和一个源点,建立超级汇点 1、2、3、6分别到达4或者5或者7的最短路径…...
自制电子农历
水文大师上线。今天一水电子农历牌。 首先讲讲电子配件,一来是电子小屏幕的选择,遇到文字比较多的,尤其是汉字,不要选传统那款128x64 oled,绝对放不下(找到最牛的超小免费字体至少要在8pixel以上才能看清楚)。我选了i…...
解决nvm安装后,node生效但npm无效
问题描述 nvm安装后,node生效但npm无效 清除缓存 C:\Users\cc\AppData\Roaming cc是我的用户名改成你自己的就行删除 npm和npm-cache...
Chrome DevTools 与 WebSocket 数据查看失焦的问题
Chrome DevTools 在与 WebSocket 连接交互时可能会出现失焦的问题,这似乎是一个已知的 bug。当 DevTools 选中 WebSocket 消息时,如果有新的消息到达,DevTools 将会自动失焦,导致无法查看完整的消息内容。 虽然这个问题很令人困扰…...
Javascript 正则
基本语法 定义 JavaScript种正则表达式有两种定义方式 构造函数 var regnew RegExp(<%[^%>]%>,g);字面量 var reg/<%[^%>]%>/g;g: global,全文搜索,默认搜索到第一个结果接停止i:ingore case,忽略…...
C语言可变数组 嵌套的可变数组,翻过了山跨过了河 又掉进了坑
可变数组 专栏内容: postgresql内核源码分析 手写数据库toadb 并发编程 个人主页:我的主页 座右铭:天行健,君子以自强不息;地势坤,君子以厚德载物. 概述 数组中元素是顺序存放,这一特性让我们…...
MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...
【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...
多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验
一、多模态商品数据接口的技术架构 (一)多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如,当用户上传一张“蓝色连衣裙”的图片时,接口可自动提取图像中的颜色(RGB值&…...
工程地质软件市场:发展现状、趋势与策略建议
一、引言 在工程建设领域,准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具,正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...
基于数字孪生的水厂可视化平台建设:架构与实践
分享大纲: 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年,数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段,基于数字孪生的水厂可视化平台的…...
零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...
JS设计模式(4):观察者模式
JS设计模式(4):观察者模式 一、引入 在开发中,我们经常会遇到这样的场景:一个对象的状态变化需要自动通知其他对象,比如: 电商平台中,商品库存变化时需要通知所有订阅该商品的用户;新闻网站中࿰…...
腾讯云V3签名
想要接入腾讯云的Api,必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口,但总是卡在签名这一步,最后放弃选择SDK,这次终于自己代码实现。 可能腾讯云翻新了接口文档,现在阅读起来,清晰了很多&…...
DAY 26 函数专题1
函数定义与参数知识点回顾:1. 函数的定义2. 变量作用域:局部变量和全局变量3. 函数的参数类型:位置参数、默认参数、不定参数4. 传递参数的手段:关键词参数5 题目1:计算圆的面积 任务: 编写一…...
