当前位置: 首页 > news >正文

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 构造函数 &#xff08;1&#xff09;定义 1&#xff09;C中的类可以定义与类名相同的特殊成员函数&#xff0c;这种与类名相同的成员函数叫做构造函数&#xff1b;2&#xff09;构造函数在定义时可以有参数&#xff1b;3&#xff09;没有任何返回类型的…...

嵌入式学习笔记——概述

嵌入式系统概述前言“嵌入式系统”概念1.是个啥&#xff1f;2.可以干啥&#xff1f;3.有哪些入坑方向&#xff1f;4.入坑后可以有多少薪资&#xff1f;单片机1.什么是单片机&#xff1f;2.架构简介3.基于ARM架构的单片机结构简介总结前言 断更很长时间了&#xff0c;写博客确实…...

化繁为简高效部署 华为云发布部署服务CodeArts Deploy

​随着互联网、数字化的发展&#xff0c;公司机构与各类企业往往需要进行大量频繁的软件部署&#xff0c;部署设备类型多样&#xff0c;如&#xff1a;本地机器、云上裸金属服务器、云上虚拟机与容器等。面对多种部署模式、分布式复杂运行环境&#xff0c;如何用最短时间、高质…...

注意力机制详解系列(四):混合注意力机制

👨‍💻作者简介: 大数据专业硕士在读,CSDN人工智能领域博客专家,阿里云专家博主,专注大数据与人工智能知识分享。 🎉专栏推荐: 目前在写CV方向专栏,更新不限于目标检测、OCR、图像分类、图像分割等方向,目前活动仅19.9,虽然付费但会长期更新,感兴趣的小伙伴可以…...

Makefiles学习1

初识"Makefiles" 创建一个 “Makefile” 文件 touch Makefile“touch” 用于修改文件或者目录的时间属性&#xff0c;包括访问时间和修改时间&#xff0c;若文件不存在&#xff0c;则重新建立一个新的文件。这里有两个需要我们注意的&#xff1a; 进入并编辑"…...

日志框架以及如何使用LogBack记录程序

使用日志框架可以记录一个程序运行的过程和详情&#xff0c;同时便捷地存储到文件里面&#xff0c;并且性能和灵活性都比较好。日志的体系结构包括两类日志规范接口&#xff1a;Commons Logging&#xff0c;简称&#xff1a;JCL&#xff1b;Simple Logging Facade for Java&…...

集成RocketChat至现有的.Net项目中,为ChatGPT铺路

文章目录前言项目搭建后端前端代理账号鉴权方式介绍登录校验模块前端鉴权方式后端鉴权方式登录委托使用登录委托处理聊天消息前端鉴权方式后端校验方式项目地址前言 今天我们来聊一聊一个Paas的方案&#xff0c;如何集成到一个既有的项目中。 以其中一个需求为例子&#xff1a…...

王道操作系统课代表 - 考研计算机 第三章 内存管理 究极精华总结笔记

本篇博客是考研期间学习王道课程 传送门 的笔记&#xff0c;以及一整年里对 操作系统 知识点的理解的总结。希望对新一届的计算机考研人提供帮助&#xff01;&#xff01;&#xff01; 关于对 “内存管理” 章节知识点总结的十分全面&#xff0c;涵括了《操作系统》课程里的全部…...

Cypher中的聚合

深解Cypher中的聚合 值或计数的聚合要么从查询返回&#xff0c;要么用作多步查询下一部分的输入。查看数据模型 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 题&#xff1a;Graph Attention Netwo…...

项目成本管理中的常见误区及解决方案

做过项目的人都明白&#xff0c;项目实施时间一般很长&#xff0c;在实施期间总有很多项目结果不尽人意的问题。要使一个项目取得成功&#xff0c;就要结合很多因素一起才能作用&#xff0c;其中做好项目成本的管理就是最重要的步骤之一&#xff0c;下面列出了常见的项目成本管…...

墨天轮2022年度数据库获奖名单

2022年&#xff0c;国家相继从高位部署、省级试点布局、地市重点深入三个维度&#xff0c;颁布了多项中国数据库行业发展的利好政策。但是我们也能清晰地看到&#xff0c;中国数据库行业发展之路道阻且长&#xff0c;而道路上的“拦路虎”之一则是生态。中国数据库的发展需要多…...

仓储调度|库存管理系统

技术&#xff1a;Java、JSP等摘要&#xff1a;随着电子商务技术和网络技术的快速发展&#xff0c;现代物流技术也在不断进步。物流技术是指与物流要素活动有关的所有专业技术的总称&#xff0c;包括各种操作方法、管理技能等&#xff0c;物流业采用某些现代信息技术方面的成功经…...

Canvas入门-01

导读&#xff1a; 读完全文需要2min。通过这篇文章&#xff0c;你可以了解到以下内容&#xff1a; Canvas标签基本属性如何使用Canvas画矩形、圆形、线条、曲线、笑脸&#x1f60a; 如果你曾经了解过Canvas&#xff0c;可以对照目录回忆一下能否回答上来 毕竟带着问题学习最有效…...

运算符优先级

醋坛酸味罐&#xff0c;位落跳福豆 醋&#xff1a;初等运算符&#xff1a; () [] -> . 坛&#xff1a;单目运算符&#xff1a; - ~ – * & ! sizeof 右结合 酸&#xff1a;算术运算符&#xff1a; - * / % 味&#xff1a;位移运算符&#xff1a;>> << …...

微信小程序使用scss编译wxss文件的配置步骤

文章目录1、在 vscode 中搜索 easysass 插件并安装2、在微信开发工具中导入安装的easysass插件3、修改 spook.easysass-0.0.6/package.json 文件中的配置4、重启开发者工具&#xff0c;就可用使用了微信小程序开发者工具集成了 vscode 编辑器&#xff0c;可以使用 vscode 中众多…...

一步一步教你如何使用 Visual Studio Code 编译一段 C# 代码

以下是一步一步教你如何使用 Visual Studio Code 编写使用 C# 语言输出当前日期和时间的代码&#xff1a; 1、下载并安装 .NET SDK。您可以从 Microsoft 官网下载并安装它。 2、打开 Visual Studio Code&#xff0c;并安装 C# 扩展。您可以在 Visual Studio Code 中通过扩展菜…...

vue-cli中的环境变量注意点

在客户端侧代码中使用环境变量只有以 VUE_APP_ 开头的变量会被 webpack.DefinePlugin 静态嵌入到客户端侧的包中。你可以在应用的代码中这样访问它们&#xff1a;console.log(process.env.VUE_APP_SECRET)在构建过程中&#xff0c;process.env.VUE_APP_SECRET 将会被相应的值所…...

2.3数据类型

文章目录1. 命名规则2.字符3.数字4.日期5.图片1. 命名规则 字段名必须以字母开头&#xff0c;尽量不要使用拼音长度不能超过30个字符&#xff08;不同数据库&#xff0c;不同版本会有不同&#xff09;不能使用SQL的保留字&#xff0c;如where,order,group只能使用如下字符a-z、…...

Kafka基本概念

什么是Kafka Kafka是一个消息系统。它可以集中收集生产者的消息&#xff0c;并由消费者按需获取。在Kafka中&#xff0c;也将消息称为日志(log)。 一个系统&#xff0c;若仅有一类或者少量的消息&#xff0c;可直接进行发送和接收。 随着业务量日益复杂&#xff0c;消息的种类…...

Unity3D中Gfx.WaitForPresent优化方案

前言 在Unity中&#xff0c;Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染&#xff08;即CPU被阻塞&#xff09;&#xff0c;这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案&#xff1a; 对惹&#xff0c;这里有一个游戏开发交流小组&…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地

借阿里云中企出海大会的东风&#xff0c;以**「云启出海&#xff0c;智联未来&#xff5c;打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办&#xff0c;现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器

——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的​​一体化测试平台​​&#xff0c;覆盖应用全生命周期测试需求&#xff0c;主要提供五大核心能力&#xff1a; ​​测试类型​​​​检测目标​​​​关键指标​​功能体验基…...

【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表

1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

3403. 从盒子中找出字典序最大的字符串 I

3403. 从盒子中找出字典序最大的字符串 I 题目链接&#xff1a;3403. 从盒子中找出字典序最大的字符串 I 代码如下&#xff1a; class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

Caliper 配置文件解析:config.yaml

Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...

什么是Ansible Jinja2

理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具&#xff0c;可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板&#xff0c;允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板&#xff0c;并通…...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)

Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败&#xff0c;具体原因是客户端发送了密码认证请求&#xff0c;但Redis服务器未设置密码 1.为Redis设置密码&#xff08;匹配客户端配置&#xff09; 步骤&#xff1a; 1&#xff09;.修…...

Go 语言并发编程基础:无缓冲与有缓冲通道

在上一章节中&#xff0c;我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道&#xff0c;它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好&#xff0…...

【从零学习JVM|第三篇】类的生命周期(高频面试题)

前言&#xff1a; 在Java编程中&#xff0c;类的生命周期是指类从被加载到内存中开始&#xff0c;到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期&#xff0c;让读者对此有深刻印象。 目录 ​…...