C++回顾(五)—— 构造函数和析构函数
5.1 构造和析构
5.1.1 构造函数
(1)定义
- 1)C++中的类可以定义与类名相同的特殊成员函数,这种与类名相同的成员函数叫做构造函数;
- 2)构造函数在定义时可以有参数;
- 3)没有任何返回类型的声明。
(2)调用
- 自动调用:一般情况下C++编译器会自动调用构造函数;
- 手动调用:在一些情况下则需要手工调用构造函数。
5.1.2 析构函数
(1)定义
- 1)C++中的类可以定义一个特殊的成员函数清理对象,这个特殊的成员函数叫做析构函数
语法:~ClassName() - 2)析构函数没有参数也没有任何返回类型的声明
(2)调用
- 析构函数在对象销毁时自动被调用
5.1.3 对象的构造和析构
(1)构造函数的分类
- 无参构造函数
- 有参构造函数
- 理解对象的初始化与对象赋值的不同
Test t1(4,5);
Test t2 = Test(5,6); // 对象的初始化
t2 = t1; // 对象的赋值
- 拷贝构造函数
- 默认构造函数
二个特殊的构造函数
1)默认无参构造函数
当类中没有定义构造函数时,编译器默认提供一个无参构造函数,并且其函数体为空
2)默认拷贝构造函数
当类中没有定义拷贝构造函数时,编译器默认提供一个默认拷贝构造函数,简单的进行成员变量的值复制
(2)构造函数的规则
- 1)当类中没有定义任何一个构造函数时,c++编译器会提供默认无参构造函数和默认拷贝构造函数
- 2)当类中定义了拷贝构造函数时,c++编译器不会提供无参数构造函数
- 3)当类中定义了任意的非拷贝构造函数(即:当类中提供了有参构造函数或无参构造函数),c++编译器不会提供默认无参构造函数
- 4 )默认拷贝构造函数成员变量简单赋值
总结:只要你写了构造函数,那么你必须用。
#include <iostream>using namespace std;class Test1
{
public:
};class Test2
{
public:Test2(){cout << "Test2无参构造函数" << endl;}
};class Test3
{
public:Test3(int a){}
};class Test4
{
public:Test4(const Test4 &t){}
};int main()
{Test1 t1; //编译器会默认提供无参构造函数Test1 tt(t1); //编译器提供默认的拷贝构造函数(浅拷贝)Test2 t2; //一旦提供了无参构造函数,编译器不再提供默认无参构造函数//Test3 t3; //一旦提供了有参构造函数,编译器不再提供默认无参构造函数(所有这里会报错)//Test4 t4; //一旦提供了拷贝构造函数,编译器不再提供无参构造函数(所有这里会报错)return 0;
}
运行结果:

(3)构造析构阶段性总结
- 1)构造函数是C++中用于初始化对象状态的特殊函数
- 2)构造函数在对象创建时自动被调用
- 3)构造函数和普通成员函数都遵循重载规则
- 4)拷贝构造函数是对象正确初始化的重要保证
- 5)必要的时候,必须手工编写拷贝构造函数
#include <iostream>
#include <cstdlib>using namespace std;class Array
{
private:int *data; //数组的起始地址int size; //数组的容量
public:Array(); //无参构造函数 函数名和类名一样 没有返回值 完成对象的初始化操作Array(int s); //有参构造函数Array(const Array &a); //拷贝构造函数void setVal(int Index, int val);int getVal(int Index);~Array(); //析构函数 函数名是类名加~ 没有参数 没有返回值
};Array::Array()
{cout << "Array的无参构造函数" << endl;size = 5;data = (int *)malloc(sizeof(int) * size);
}Array::Array(int s)
{cout << "Array的有参构造函数" << endl;size = s;data = (int *)malloc(sizeof(int) * size);
}Array::Array(const Array &a)
{cout << "Array的拷贝构造函数" << endl;
}void Array::setVal(int Index, int val)
{data[Index] = val;
}int Array::getVal(int Index)
{ return data[Index];
}Array::~Array()
{cout << "Array析构函数" << endl;if (data != NULL){free(data);}
}void f(Array a)
{}int main()
{Array a1; //创建对象的时候,自动调用构造函数Array a2(10);//有参构造函数(这个用的最多)Array a3 = Array(10);Array a4 = (10);for (int i = 0; i < 5; i++){a1.setVal(i, i + 1);}for (int i = 0; i < 5; i++){cout << a1.getVal(i) << " ";}cout << endl;cout << "********" << endl;f(a1); //函数传参,会调用拷贝构造函数//Array a5(a2); //调用拷贝构造函数 用a2构造a5return 0; //释放对象的时候,自动调用析构函数
}
运行结果:

5.2 深拷贝和浅拷贝
5.2.1 浅拷贝问题分析
完成数组类,主函数调用拷贝构造函数,观察代码会出现什么问题?
默认复制构造函数可以完成对象的数据成员值简单的复制
对象的数据资源是由指针指示的堆时,默认复制构造函数仅作指针值复制
注意:这样在析构的时候,会出现释放两次空间的情况,出现报错
5.2.2 浅拷贝问题解决:深拷贝
#include <iostream>
#include <stdlib.h>using namespace std;class Array
{
private:int *data;int size;
public:Array(int s){cout << "有参构造函数" << endl;size = s;data = (int *)malloc(sizeof(int) * size);}Array(const Array &a) //深拷贝{cout << "Array拷贝构造函数" << endl;size = a.size;data = (int *)malloc(sizeof(int) * size);for (int i = 0; i < size; i++){data[i] = a.data[i];}}~Array(){cout << "析构函数" << endl;if (data != NULL){free(data);}}
};int main()
{Array a1(10);Array a2(a1); //编译器为每个类提供默认的拷贝构造函数 只做简单的赋值(浅拷贝)return 0;
}
运行结果:

5.3 匿名对象
#include <iostream>using namespace std;class Test
{
public:Test(){cout << "Test无参构造函数" << endl;}~Test(){cout << "Test析构函数" << endl;}
};int main()
{Test(); //匿名对象,本行代码执行完,立即被释放Test();return 0;
}
运行结果:

相关文章:
C++回顾(五)—— 构造函数和析构函数
5.1 构造和析构 5.1.1 构造函数 (1)定义 1)C中的类可以定义与类名相同的特殊成员函数,这种与类名相同的成员函数叫做构造函数;2)构造函数在定义时可以有参数;3)没有任何返回类型的…...
嵌入式学习笔记——概述
嵌入式系统概述前言“嵌入式系统”概念1.是个啥?2.可以干啥?3.有哪些入坑方向?4.入坑后可以有多少薪资?单片机1.什么是单片机?2.架构简介3.基于ARM架构的单片机结构简介总结前言 断更很长时间了,写博客确实…...
化繁为简高效部署 华为云发布部署服务CodeArts Deploy
随着互联网、数字化的发展,公司机构与各类企业往往需要进行大量频繁的软件部署,部署设备类型多样,如:本地机器、云上裸金属服务器、云上虚拟机与容器等。面对多种部署模式、分布式复杂运行环境,如何用最短时间、高质…...
注意力机制详解系列(四):混合注意力机制
👨💻作者简介: 大数据专业硕士在读,CSDN人工智能领域博客专家,阿里云专家博主,专注大数据与人工智能知识分享。 🎉专栏推荐: 目前在写CV方向专栏,更新不限于目标检测、OCR、图像分类、图像分割等方向,目前活动仅19.9,虽然付费但会长期更新,感兴趣的小伙伴可以…...
Makefiles学习1
初识"Makefiles" 创建一个 “Makefile” 文件 touch Makefile“touch” 用于修改文件或者目录的时间属性,包括访问时间和修改时间,若文件不存在,则重新建立一个新的文件。这里有两个需要我们注意的: 进入并编辑"…...
日志框架以及如何使用LogBack记录程序
使用日志框架可以记录一个程序运行的过程和详情,同时便捷地存储到文件里面,并且性能和灵活性都比较好。日志的体系结构包括两类日志规范接口:Commons Logging,简称:JCL;Simple Logging Facade for Java&…...
集成RocketChat至现有的.Net项目中,为ChatGPT铺路
文章目录前言项目搭建后端前端代理账号鉴权方式介绍登录校验模块前端鉴权方式后端鉴权方式登录委托使用登录委托处理聊天消息前端鉴权方式后端校验方式项目地址前言 今天我们来聊一聊一个Paas的方案,如何集成到一个既有的项目中。 以其中一个需求为例子:…...
王道操作系统课代表 - 考研计算机 第三章 内存管理 究极精华总结笔记
本篇博客是考研期间学习王道课程 传送门 的笔记,以及一整年里对 操作系统 知识点的理解的总结。希望对新一届的计算机考研人提供帮助!!! 关于对 “内存管理” 章节知识点总结的十分全面,涵括了《操作系统》课程里的全部…...
Cypher中的聚合
深解Cypher中的聚合 值或计数的聚合要么从查询返回,要么用作多步查询下一部分的输入。查看数据模型 CALL db.schema.visualization() 查看图中节点的属性类型 CALL db.schema.notetypeproperties() 查看图中关系的属性类型 CALL db.schema.reltypeproperties() C…...
图注意网络GAT理解及Pytorch代码实现【PyGAT代码详细注释】
文章目录GAT代码实现【PyGAT】GraphAttentionLayer【一个图注意力层实现】用上面实现的单层网络测试加入Multi-head机制的GAT对数据集Cora的处理csr_matrix()处理稀疏矩阵encode_onehot()对label编号build graph邻接矩阵构造GAT的推广GAT 题:Graph Attention Netwo…...
项目成本管理中的常见误区及解决方案
做过项目的人都明白,项目实施时间一般很长,在实施期间总有很多项目结果不尽人意的问题。要使一个项目取得成功,就要结合很多因素一起才能作用,其中做好项目成本的管理就是最重要的步骤之一,下面列出了常见的项目成本管…...
墨天轮2022年度数据库获奖名单
2022年,国家相继从高位部署、省级试点布局、地市重点深入三个维度,颁布了多项中国数据库行业发展的利好政策。但是我们也能清晰地看到,中国数据库行业发展之路道阻且长,而道路上的“拦路虎”之一则是生态。中国数据库的发展需要多…...
仓储调度|库存管理系统
技术:Java、JSP等摘要:随着电子商务技术和网络技术的快速发展,现代物流技术也在不断进步。物流技术是指与物流要素活动有关的所有专业技术的总称,包括各种操作方法、管理技能等,物流业采用某些现代信息技术方面的成功经…...
Canvas入门-01
导读: 读完全文需要2min。通过这篇文章,你可以了解到以下内容: Canvas标签基本属性如何使用Canvas画矩形、圆形、线条、曲线、笑脸😊 如果你曾经了解过Canvas,可以对照目录回忆一下能否回答上来 毕竟带着问题学习最有效…...
运算符优先级
醋坛酸味罐,位落跳福豆 醋:初等运算符: () [] -> . 坛:单目运算符: - ~ – * & ! sizeof 右结合 酸:算术运算符: - * / % 味:位移运算符:>> << …...
微信小程序使用scss编译wxss文件的配置步骤
文章目录1、在 vscode 中搜索 easysass 插件并安装2、在微信开发工具中导入安装的easysass插件3、修改 spook.easysass-0.0.6/package.json 文件中的配置4、重启开发者工具,就可用使用了微信小程序开发者工具集成了 vscode 编辑器,可以使用 vscode 中众多…...
一步一步教你如何使用 Visual Studio Code 编译一段 C# 代码
以下是一步一步教你如何使用 Visual Studio Code 编写使用 C# 语言输出当前日期和时间的代码: 1、下载并安装 .NET SDK。您可以从 Microsoft 官网下载并安装它。 2、打开 Visual Studio Code,并安装 C# 扩展。您可以在 Visual Studio Code 中通过扩展菜…...
vue-cli中的环境变量注意点
在客户端侧代码中使用环境变量只有以 VUE_APP_ 开头的变量会被 webpack.DefinePlugin 静态嵌入到客户端侧的包中。你可以在应用的代码中这样访问它们:console.log(process.env.VUE_APP_SECRET)在构建过程中,process.env.VUE_APP_SECRET 将会被相应的值所…...
2.3数据类型
文章目录1. 命名规则2.字符3.数字4.日期5.图片1. 命名规则 字段名必须以字母开头,尽量不要使用拼音长度不能超过30个字符(不同数据库,不同版本会有不同)不能使用SQL的保留字,如where,order,group只能使用如下字符a-z、…...
Kafka基本概念
什么是Kafka Kafka是一个消息系统。它可以集中收集生产者的消息,并由消费者按需获取。在Kafka中,也将消息称为日志(log)。 一个系统,若仅有一类或者少量的消息,可直接进行发送和接收。 随着业务量日益复杂,消息的种类…...
美政府AI主管:Anthropic 将在 18 个月内成为人类历史最有价值公司
Anthropic 已经成为人工智能革命中最成功的案例之一,但这或许还不是全部。风险投资家兼美国政府人工智能和加密货币沙皇大卫萨克斯在 All-In播客节目中提出了一个惊人的说法:Anthropic 不仅有望成为科技界最强大的公司,而且有望成为人类历史上…...
STM32F407上电后第一行代码:手把手带你读懂启动文件startup_stm32f407xx.s
STM32F407启动文件深度解析:从复位到main()的底层之旅 当你第一次打开STM32的MDK工程时,那个神秘的.s文件是否曾让你望而却步?作为连接硬件与C语言世界的桥梁,启动文件(startup_stm32f407xx.s)完成了从芯片…...
3步解锁联想刃7000k BIOS隐藏功能:安全提升硬件性能的完整指南
3步解锁联想刃7000k BIOS隐藏功能:安全提升硬件性能的完整指南 【免费下载链接】Lenovo-7000k-Unlock-BIOS Lenovo联想刃7000k2021-3060版解锁BIOS隐藏选项并提升为Admin权限 项目地址: https://gitcode.com/gh_mirrors/le/Lenovo-7000k-Unlock-BIOS 联想刃7…...
马斯克解散 xAI、接纳 Anthropic:亡羊补牢的无奈,与一场被 AGI 神话带偏的豪赌
马斯克解散 xAI、接纳 Anthropic:亡羊补牢的无奈,与一场被 AGI 神话带偏的豪赌 2026 年 5 月 6 日,两件事同时发生: 一、Anthropic 宣布获得 xAI Colossus 1 集群的全部算力——22 万张英伟达 GPU,300 兆瓦电力容量。 …...
STM32CUBEMX实战指南:串口DMA高效收发与自定义打印函数优化
1. 串口DMA基础与STM32CubeMX配置 第一次用STM32CubeMX配置串口DMA时,我对着密密麻麻的选项差点崩溃。后来发现只要掌握几个关键点,5分钟就能搞定稳定可靠的DMA通信。先解释下为什么需要DMA:当你用传统方式通过串口发送"Hello World&quo…...
2026最权威的六大降AI率工具解析与推荐
Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 于学术创作以及报告撰写的场景当中,内容重复率超出标准限度常常是创作者所面临的…...
服务器运维与DevOps融合:迈向智能化运维的新纪元
在数字化浪潮席卷全球的今天,企业对IT基础设施的依赖程度日益加深,服务器运维作为支撑业务连续性和系统稳定性的核心环节,正面临前所未有的挑战与机遇。传统运维模式依赖人工干预、响应滞后、效率低下,已难以满足现代业务快速迭代…...
告别马赛克!用MATLAB复刻复古报纸印刷的Bayer抖动算法(附完整代码)
用MATLAB重现复古报纸印刷:Bayer抖动算法的艺术与技术实践 老式报纸上的图片总带着一种独特的粗糙美感——那些由无数小黑点构成的图像,在纸张上呈现出微妙的灰度过渡。这种看似简单的印刷技术背后,隐藏着数字图像处理中一项经典算法…...
工程实践:AI 编程从提示词走向流水线,才需要 API 中转站
这类内容的核心判断应该换一下:用户不是先想买 API,中间才想到 Claude / Codex;很多时候正相反,是先想用 Claude / Codex 提升开发效率,才开始寻找稳定、可接入、可支付、可迁移的 API 入口。目标用户画像想把需求分析…...
AI Token中转副业火爆!小白也能快速上手?3小时建站+真实盈利模式全解析!
很多观望的小白最纠结两个核心问题:普通人搭建一个Token中转站到底要多久?建好之后真的能赚钱吗,真实赚钱逻辑是什么? 今天不讲噱头、不吹月入几万,结合行业真实现状、新手实操经验,一次性讲透搭建耗时、成…...
