【c++】类和对象2—构造函数、析构函数、拷贝构造函数
文章目录
- 构造函数和析构函数
- 构造函数的分类及调用
- 拷贝构造函数调用时机
- 构造函数调用规则
- 深拷贝与浅拷贝
构造函数和析构函数
c++利用了构造函数和析构函数解决上述问题,这两个函数将会被编译器自动调用,完成对象初始化和清理工作。对象的初始化和清理工作是编译器强制要我们做的事情,因此如果我们不提供构造和析构,编译器会提供编译器的构造函数和析构函数是空实现。
**构造函数:**主要作用在于创建对象时为对象的成员属性赋值,构造函数由编译器自动调用,无需手动调用。
**析构函数:**主要作用在于对象销毁前系统自动调用,执行一些清理工作。
构造函数:
语法:类名(){}
1、构造函数,没有返回值也不写void;
2、函数名称与类名相同;
3、构造函数可以有参数,因此可以发生重载;
4、程序在调用对象时会自动调用构造函数,无需手动调用,而且只会调用一次。
析构函数:
语法:~类名(){}
1、析构函数,没有返回值也不写void;
2、函数名称与类名相同,在名称前加上符号~;
3、析构函数不可以有参数,因此不可以发生重载;
4、程序在对象销毁前会自动调用析构函数,无需手动调用,而且只会调用一次。
#include<iostream>
using namespace std;class Person
{
public:Person(){cout << "Person的构造函数调用" << endl;}~Person(){cout << "Person的析构函数调用" << endl;}
};//构造和析构函数都是必须有的实现,如果自己不提供,编译器会提供一个空实现的构造和析构
void test()
{Person p;//在栈上的数据,test执行完毕后,释放这个对象
}int main()
{test();//输出1Person p;//输出2system("pause");return 0;
}输出1:
Person的构造函数调用
Person的析构函数调用
输出2:
Person的构造函数调用
请按任意键继续. . .
Person的析构函数调用
test函数已经只需完成,可以调用析构函数;
main函数还没有执行完成,无法调用析构函数。
构造函数的分类及调用
分类:
1、按照参数分类:无参构造(默认构造)和有参构造
2、按照类型分类:普通构造和拷贝构造
//分类
class Person
{
public:int age;//普通构造Person()//无参构造{cout << "Person的无参构造函数调用" << endl;}Person(int a)//有参构造{age = a;cout << "Person的有参构造函数调用" << endl;}//拷贝构造函数Person(const Person& p){//将传入的人身上的所有属性拷贝过来age = p.age;cout << "Person的拷贝构造函数调用" << endl;}//析构函数~Person(){cout << "Person的析构函数调用" << endl;}
};
调用:
1、括号法
2、显式法
3、隐式法
//调用
void test()
{//1、括号法Person p1;//默认构造函数调用Person p2(10);//默认构造函数调用Person p3(p2);//默认构造函数调用//注意1:调用默认构造函数时,不要加()//因为编译器会认为这是一个函数的声明,不会认为在创建对象//Person p1();和void func();相似//2、显式法Person p1;Person p2 = Person(10);//有参构造调用Person p3 = Person(p2);//拷贝构造调用Person(10);//匿名对象 特点:当前执行结束后,系统会立即回收掉匿名对象//注意2:不要利用拷贝构造函数初始化匿名对象//编译器会认为Person(p3)===Person p3;对象声明//3、隐式转换法Person p1 = 10;//有参构造,相当于写了Person p4=Person(10);Person p2 = p1;//拷贝构造
}
拷贝构造函数调用时机
通常由三种情况:
1、使用一个已经创建完毕的对象来初始化一个新对象;
2、值传递的方式给函数参数传值;
3、值方式返回局部对象。
class Person
{
public:int age;//普通构造Person()//无参构造{cout << "Person的无参构造函数调用" << endl;}Person(int a)//有参构造{age = a;cout << "Person的有参构造函数调用" << endl;}//拷贝构造函数Person(const Person& p){age = p.age;cout << "Person的拷贝构造函数调用" << endl;}//析构函数~Person(){cout << "Person的析构函数调用" << endl;}
};//1、使用一个已经创建完毕的对象来初始化一个新对象
void test01()
{Person p1(20);Person p2(p1);cout << "p2的年龄为:" << p2.age << endl;
}//2、值传递的方式给函数参数传值
void dowork(Person p)
{}
void test02()
{Person p;dowork(p);
}//3、值方式返回局部对象
Person dowork02()
{Person p1;return p1;
}
void test03()
{Person p = dowork02();
}
构造函数调用规则
默认情况下,c++编译器至少给一个类添加3个函数
1、默认构造函数(无参,函数体为空)
2、默认析构函数(无参,函数体为空)
3、默认拷贝构造函数,对属性进行值拷贝
构造函数调用规则如下:
1、如果用户定义有参构造函数,c++不再提供默认构造函数,但是会提供默认拷贝构造;
2、如果用户定义拷贝构造函数,c++不会提供其他构造函数。
深拷贝与浅拷贝
浅拷贝:简单的赋值拷贝操作;
深拷贝:在堆区重新申请空间,进行拷贝操作。
如果属性有在堆区开辟的,一定要自己提供拷贝构造函数,防止浅拷贝带来的问题。
#include<iostream>
using namespace std;class Person
{
public://无参构造函数Person() {cout << "无参构造函数!" << endl;}//有参构造函数Person(int age, int height) {cout << "有参构造函数!" << endl;m_age = age;//深拷贝操作m_height = new int(height);}//拷贝构造函数Person(const Person& p) {cout << "拷贝构造函数!" << endl;//如果不利用深拷贝在堆区创建新内存,会导致浅拷贝带来的重复释放堆区问题m_age = p.m_age;//m_height = p.m_height;//编译器默认实现这行代码//深拷贝操作m_height = new int(*p.m_height);}//析构函数~Person() {//析构代码,将堆区开辟数据做释放操作cout << "析构函数!" << endl;if (m_height != NULL){delete m_height;}}int m_age;int* m_height;};void test()
{Person p1(18, 180);Person p2(p1);cout << "p1的年龄:" << p1.m_age << "身高:" << *p1.m_height << endl;cout << "p2的年龄:" << p2.m_age << "身高:" << *p2.m_height << endl;
}int main()
{test();system("pause");return 0;
}
相关文章:
【c++】类和对象2—构造函数、析构函数、拷贝构造函数
文章目录构造函数和析构函数构造函数的分类及调用拷贝构造函数调用时机构造函数调用规则深拷贝与浅拷贝构造函数和析构函数 c利用了构造函数和析构函数解决上述问题,这两个函数将会被编译器自动调用,完成对象初始化和清理工作。对象的初始化和清理工作是…...
[C++关键字] const/constexpr
文章目录const/constexpr[^1]const 与 宏const 与 类const 与 指针const 其他constexpr (C11之后)referenceconst/constexpr1 尽可能的使用constexpr对于不变的变量,尽量用const修饰 const 与 宏 const vs define的比较:define只是字符的替换…...
FPGA电源电流参数
一、FPGA里各个电源释义 VCCINT VCCINT是FPGA芯片的内核电压,是用来给FPGA内部的逻辑门和触发器上的电压。即芯片的晶体管开关是有核心电压提供。当内部逻辑工作时钟速率越高,使用逻辑资源越多,则核心电压供电电流会更大,可高达几…...
【Git】Git下载安装与使用(一)
目录 1. 前言 1.1 什么是Git 1.2 使用Git能做什么 2. Git概述 2.1 Git简介 2.2 Git下载与安装 3. Git代码托管服务 3.1 常用的Git代码托管服务 3.2 码云代码托管服务 1. 前言 1.1 什么是Git Git是一个分布式版本控制工具,主要用于管理开发过程中的源代码…...
刷题记录:牛客NC20545[HEOI2012]采花
传送门:牛客 题目描述: 题目较长,此处暂略 输入: 5 3 5 1 2 2 3 1 1 5 1 2 2 2 2 3 3 5 输出: 2 0 0 1 0总结一下题意,就是求区间[l,r][l,r][l,r]出现次数大于1的花的种类数. 考虑使用主席树或者离线树状数组的方法来解决.由于数据加强的原因,导致主席树在本题中是不能完美通…...
每日学术速递2.21
CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CV 1.T2I-Adapter: Learning Adapters to Dig out More Controllable Ability for Text-to-Image Diffusion Models 标题:T2I-Adapter:学习Adapter,为…...
网络安全之认识挖矿木马
一、什么是挖矿木马? 比特币是以区块链技术为基础的虚拟加密货币,比特币具有匿名性和难以追踪的特点,经过十余年的发展,已成为网络黑产最爱使用的交易媒介。大多数勒索病毒在加密受害者数据后,会勒索代价高昂的比特币…...
OpenCV实战——基于分水岭算法的图像分割
OpenCV实战——基于分水岭算法的图像分割0. 前言1. 分水岭算法2. 分水岭算法直观理解3. 完整代码相关链接0. 前言 分水岭变换是一种流行的图像处理算法,用于快速将图像分割成同质区域。分水岭变换主要基于以下思想:当图像被视为拓扑浮雕时,均…...
YOLOv8模型调试记录
前言 新年伊始,ultralytics 公司在 2023 年 1月 10 号开源的 YOLOv5 的下一个重大更新版本,目前支持图像分类、物体检测和实例分割任务,在还没有开源时就收到了用户的广泛关注。 值得一提的是,在博主的印象中,YOLO系…...
算法刷题打卡第97天:删除字符串两端相同字符后的最短长度
删除字符串两端相同字符后的最短长度 难度:中等 给你一个只包含字符 a,b 和 c 的字符串 s ,你可以执行下面这个操作(5 个步骤)任意次: 选择字符串 s 一个 非空 的前缀,这个前缀的所有字符都相…...
WebGPU学习(3)---使用IndexBuffer(索引缓冲区)
现在让我们将 IndexBuffer 与 VertexBuffer 一起使用。演示示例 1.准备索引数据 我们用 Uint16Array 类型来准备索引数据。我们将矩形的4个点放到 VertexBuffer 中,然后根据三角形绘制顺序,组织成 0–1–2 和 0–2–3 的结构。 const quadIndexArray …...
Java代码加密混淆工具有哪些?
在Java中,代码加密混淆工具可以帮助开发者将源代码进行加密和混淆处理,以增加代码的安全性和保护知识产权。以下是一些流行的Java代码加密混淆工具: 第一款:ProGuard:ProGuard ProGuard:ProGuard…...
华为OD机试 - 高效的任务规划(Python) | 机试题+算法思路+考点+代码解析 【2023】
高效的任务规划 题目 你有 n 台机器编号为1-n,每台都需要完成一项工作, 机器经过配置后都能独立完成一项工作。 假设第i台机器你需要花 Bi 分钟进行设置, 然后开始运行,Ji分钟后完成任务。 现在,你需要选择布置工作的顺序,使得用最短的时间完成所有工作。 注意,不能同…...
ChatGPT写程序如何?
前言ChatGPT最近挺火的,据说还能写程序,感到有些惊讶。于是在使用ChatGPT有一周左右后,分享一下用它写程序的效果如何。1、对于矩阵,把减法操作转换加法?感觉不错的,能清晰介绍原理,然后写示例程…...
编译链接实战(9)elf符号表
文章目录符号的概念符号表探索前面介绍了elf文件的两种视图,以及两种视图的各自几个组成部分:elf文件有两种视图,链接视图和执行视图。在链接视图里,elf文件被划分成了elf 头、节头表、若干的节(section)&a…...
React合成事件的原理是什么
事件介绍 什么是事件? 事件是在编程时系统内发生的动作或者发生的事情,而开发者可以某种方式对事件做出回应,而这里有几个先决条件 事件对象 给事件对象注册事件,当事件被触发后需要做什么 事件触发 举个例子 在机场等待检票…...
Arduino-交通灯
LED交通灯实验实验器件:■ 红色LED灯:1 个■ 黄色LED灯:1 个■ 绿色LED灯:1 个■ 220欧电阻:3 个■ 面包板:1 个■ 多彩杜邦线:若干实验连线1.将3个发光二极管插入面包板,2.用杜邦线…...
【论文笔记】Manhattan-SDF == ZJU == CVPR‘2022 Oral
Neural 3D Scene Reconstruction with the Manhattan-world Assumption 本文工作:基于曼哈顿世界假设,重建室内场景三维模型。 1.1 曼哈顿世界假设 参考阅读文献:Structure-SLAM: Low-Drift Monocular SLAM in Indoor EnvironmentsIEEE IR…...
好消息!Ellab(易来博)官方微信公众号开通了!携虹科提供专业验证和监测解决方案
自1949年以来,丹麦Ellab一直通过全球范围内的验证和监测解决方案,协助全球生命科学和食品公司优化和改进其流程的质量。Ellab全面的无线数据记录仪,热电偶系统,无线环境监测系统,校准设备,软件解决方案等等…...
想要去字节跳动面试Android岗,给你这些面试知识点
关于面试字节跳动,我总结一些面试点,希望可以帮到更多的小伙伴,由于篇幅问题这里没有把全部的面试知识点问题都放上来!!目录:1.网络2.Java 基础&容器&同步&设计模式3.Java 虚拟机&内存结构…...
从一次生产事故复盘:我们如何优雅地处理用户上传的‘异常’Excel文件(附Apache POI配置详解)
从生产事故到防御体系:构建Excel文件处理的工程化解决方案那天凌晨2点,我被一阵急促的告警声惊醒。监控系统显示,核心文件处理服务的错误率在10分钟内飙升到35%,大量用户上传的Excel文件无法正常解析。更糟糕的是,部分…...
Goframe项目实战:从数据库表到API接口的全链路开发指南(含避坑点)
Goframe项目实战:从数据库表到API接口的全链路开发指南(含避坑点)在当今微服务架构盛行的时代,Go语言因其高性能和并发优势成为后端开发的热门选择。而Goframe作为一款企业级的Go应用开发框架,提供了从数据库操作到API…...
蓝牙抓包不求人:从HCI日志里‘挖’出Link Key的两种实用方法(附安卓路径)
蓝牙安全逆向实战:从HCI日志中提取Link Key的深度解析在蓝牙协议安全研究领域,Link Key作为设备配对认证的核心凭证,其获取方式一直是逆向工程师关注的焦点。许多安全审计场景下,我们往往只能获得加密后的HCI通信日志,…...
Blender渲染通道完全指南:如何像电影后期一样,分离出深度、阴影与反射图
Blender渲染通道完全指南:影视级后期制作的深度解析在数字内容创作领域,Blender已经从一个简单的3D建模工具成长为能够处理复杂视觉特效的全流程解决方案。对于追求影视级质量的中高级用户而言,掌握渲染通道技术是提升作品专业度的关键一步。…...
从电磁炉到户外电源:拆解单相SVPWM如何让你的逆变器更安静、更高效
从电磁炉到户外电源:单相SVPWM如何实现静音与高效的双重突破当你深夜用电磁炉煮面时,是否曾被突然的蜂鸣声吓一跳?或是发现户外电源给设备充电时,散热风扇的噪音盖过了山林鸟鸣?这些常见问题背后,隐藏着一个…...
告别手写UI!用NXP GUI Guider拖拽设计LVGL界面,5分钟搞定音乐播放器Demo
嵌入式UI开发革命:5分钟用GUI Guider构建LVGL音乐播放器在嵌入式系统开发中,用户界面(UI)设计曾长期是工程师的痛点——既要考虑资源受限的硬件环境,又要实现流畅美观的交互体验。传统手动编写UI代码的方式不仅效率低下,调试过程更…...
QMCDecode终极指南:3步解锁QQ音乐加密格式,实现跨平台音乐自由
QMCDecode终极指南:3步解锁QQ音乐加密格式,实现跨平台音乐自由 【免费下载链接】QMCDecode QQ音乐QMC格式转换为普通格式(qmcflac转flac,qmc0,qmc3转mp3, mflac,mflac0等转flac),仅支持macOS,可自动识别到QQ音乐下载目…...
3分钟掌握HashCalculator:你的文件完整性守护专家
3分钟掌握HashCalculator:你的文件完整性守护专家 【免费下载链接】HashCalculator 哈希值计算工具,批量计算/批量校验/查找重复文件/改变哈希值等,支持集成到系统右键菜单 项目地址: https://gitcode.com/gh_mirrors/ha/HashCalculator …...
3步解锁专业级MMD创作:Blender插件如何重塑二次元动画工作流
3步解锁专业级MMD创作:Blender插件如何重塑二次元动画工作流 【免费下载链接】blender_mmd_tools MMD Tools is a blender addon for importing/exporting Models and Motions of MikuMikuDance. 项目地址: https://gitcode.com/gh_mirrors/bl/blender_mmd_tools …...
解决Claude Code Token不足问题并享受Taotoken活动价
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 解决Claude Code Token不足问题并享受Taotoken活动价 应用场景类,聚焦于使用Claude Code时遇到Token配额紧张的开发者&…...
