深入理解构造函数,析构函数

目录

1.引言

2.构造函数

1.概念

2.特性

3.析构函数

1.概念

2.特性


1.引言

           如果一个类中什么都没有,叫作空类.

class A {};

        那么我们这个类中真的是什么都没有吗?其实不是,如果我们类当中上面都不写.编译器会生成6个默认的成员函数。

        默认成员函数:用户没有显示写 , 编译器自动生成的函数。

        这里我们只介绍两个构造函数,析构函数

2.构造函数

class Stack {
public:void init(int defaultCapacity) {_a = new int[defaultCapacity];_top = 0;}void destory() {delete[] _a;_top = 0;}
private:int* _a;int _top;
};
int main() {Stack s;s.init();return 0;
}

        我们想要去写一个栈,但是我们每次都要调用init去初始化非常麻烦,那么我们有没有上面方法不用写init()呢?有的,所以我们就引出了构造函数.

1.概念

        构造函数是一个默认的成员函数,名字与类名相同,每次创建对象的时候自动调用,完成对象的初始化,在生命周期内只会调用一次。

2.特性

        1.名字与类名相同.

        2.无返回值

                例如:我们上面的栈

  Stack()  {_a = new int[4];_top = 0;}

        3.可以进行重载

带参数
Stack(int defaultCapacity) {_a = new int[defaultCapacity];_top = 0;
}不带参数
Stack() {_a = new int[4];_top = 0;
}

        4.自动调用

class A {
public:A() {cout << "A()" << endl;}
};
int main() {A a;return 0;
}

        例如我们有一个类A,它有一个无参的构造函数,我们在创建对象的时候,没有显示的调用构造函数,但是是我们调用的时候会打印出A().

        这是因为我们的构造函数,在创建对象的时候会自动调用,来初始化对象。

5.用户定义的时候就不会再生成

        我们把A改为不带构造函数的类

class A {
public:
};
int main() {A a;return 0;
}

        我们看到没有报错,因为编译器在我们没有写构造函数的时候生成一个隐式不带参数的构造函数.

        还是上面的例子,我们把A的构造函数改成带有一个参数的构造函数.

class A {
public:A(int a) {cout << "A(a)" << endl;}
};
int main() {A a;return 0;
}

        这个时候,我们在像刚才一样创建对象编译器就会报错。

        这是因为我们没有写构造函数的时候,编译器会默认生成一个不带参数的构造函数.如果我们显示写了构造函数编译器就不会生成。

6.生成默认构造对内置类型不进行处理

       还是上面的例子,我们把类A中添加结果成员变量

class A {
public:int _a;double _d;int* _ptr;
};
int main() {A a;return 0;
}

        这个时候我们没有显示的写构造函数,这个时候编译器会自动生成一个不带参数的构造函数.

这个时候我们想看到默认构造对内置类型做不做处理怎么办?这个时候我们可以通过调式去看

        我们看一下调式结果,_a和_d都为随机值,这说明我们生成的默认构造对内置类型不做处理.那么我们以后是不是都要写构造函数呢?

         其实不是,在c++在声明的时候可以给缺省值.这个时候我们给缺省值,再调式看一下结果.

     7.  默认构造函数:  编译器自动生成,无参,全缺省都可以称为默认构造函数

class A {
public:A() {cout << "A()" << endl;}A(int a = 1, int b = 1) {cout << "A(int a = 1, int b = 1)" << endl;}int _a;int _b;
};
int main() {A a;return 0;
}

        什么的代码编译器会报错这是为什么?因为,无参的和全缺省的都可以不传参数,编译器无法辨别调用哪一个.所以就会报错.

3.析构函数

        还是上面的栈,如果我们想让销毁栈,每次都要调用destroy非常麻烦,而且有时候我们会忘记调用,这个就会导致内存泄漏导致程序崩溃。所以我们c++就引出一个新的默认成员函数叫作析构函数.

1.概念

        与构造函数的功能相反,析构函数是用来清理对象内的资源的,不是用来销毁对象,局部的对象销毁,是编译器来完成的。

2.特性

        1.在类名前面加上~

        2.无返回值

        例如:

-Stack() {
}

3.一个类中只能有一个析构函数,和构造函数一样如果我们不显示定义析构函数,编译器就会自动生成(析构函数不能重载)

 4.析构函数会自动调用

class A {
public:~A() {cout << "~A()" << endl;}
};
int main() {A a;return 0;
}

        我们这个代码没有显示的调用析构函数,但是最后的结果却输出~A().

        这就说明了我们的析构函数和构造函数一样是自动调用.

 5.编译器生成的默认成员函数对自定义类型自动调用自定义类型的构造函数

class B {
public:~B() {cout << "~B()" << endl;}
};
class A {
public:B _b;
};
int main() {A a;return 0;
}

        什么代码中A类当中有一个自定义类型B,并且A当中没用显示的写析构函数,是由编译器自动生成的构造函数.我们看一下运行之后的结果是什么?

        

        我们可以看到输出了~B(),说明编译器默认生成的析构函数,对自定义类型会去调用的它的析构函数.

        6.如果类当中没有定义资源,那么我们的析构函数可以不写,直接用编译器生成的析构函数即可.

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

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

相关文章

Oracle 11.2.0.4 pre PSU Oct18 设置SSL连接

Oracle 11.2.0.4 pre PSU Oct18 设置SSL连接 1 说明2 客户端配置jdk环境3服务器检查oracle数据库补丁4设置ssla 服务器配置walletb 上传测试脚本和配置文件到客户端c 服务器修改数据库侦听和sqlnet.orad 修改客户端的sqlnet.ora和tnsnames.ora的连接符e 修改java代码的数据连接…

BrepGen中的几何特征组装与文件保存详解 deepwiki occwl OCC包装库

有这种好东西我怎么不知道 AutodeskAILab/occwl: Lightweight Pythonic wrapper around pythonocc 组装几何特征以创建B-rep模型 保存为STEP和STL文件细说 Fast 快速 Searched across samxuxiang/BrepGen Ill explain how BrepGen assembles geometric features to create B-r…

重庆 ICPC 比赛游记

2025.5.9 比赛前一天晚上&#xff0c;激动地睡不着觉&#xff0c;起来收拾了好多东西。&#xff08;其实就四本书&#xff0c;剩下的全是零食……关键在于这四本书基本没用。&#xff09; 2025.5.10 学校丧心病狂的让我们 6:20 到校门口集合坐车&#xff08;据说是怕赶不上比…

0x08.Redis 支持事务吗?如何实现?

回答重点 Redis 支持事务,但它的事务与 MySQL 等关系型数据库的事务有着本质区别。MySQL 中的事务严格遵循 ACID 特性,而 Redis 中的事务主要保证的是命令执行的原子性和隔离性,即所有命令在一个不可分割的操作中顺序执行,不会被其他客户端的命令请求所打断。 最关键的区…

佰力博科技与您探讨表面电阻的测试方法及应用领域

表面电阻测试是一种用于测量材料表面电阻值的技术&#xff0c;广泛应用于评估材料的导电性能、静电防护性能以及绝缘性能。 1、表面电阻的测试测试方法&#xff1a; 表面电阻测试通常采用平行电极法、同心圆电极法和四探针法等方法进行。其中&#xff0c;平行电极法通过在试样…

数据库的规范化设计方法---3种范式

第一范式&#xff08;1NF&#xff09;&#xff1a;确保表中的每个字段都是不可分割的基本数据项。 第二范式&#xff08;2NF&#xff09;&#xff1a;在满足1NF的基础上&#xff0c;确保非主属性完全依赖于主键。 第三范式&#xff08;3NF&#xff09;&#xff1a;在满足2NF的基…

产品经理入门(2)产品体验报告

产品体验报告大纲&#xff1a;重点在产品体验——优点。 1.产品概括 可以从各大平台搜产品介绍。 2.市场分析 按照产品方向分析各个指标——包括有效使用时间,市场规模等。 3. 用户分析——对用户通过各项指标画像。 4.产品体验——对各项功能与设计的体验。 5.报告总结

[Java][Leetcode simple] 13. 罗马数字转整数

一、自己想的 只有提到的六种情况是-&#xff0c;其他都是 public int romanToInt1(String s) {int res 0;int n s.length();Map<Character, Integer> map new HashMap<>();map.put(I, 1);map.put(V, 5);map.put(X, 10);map.put(L, 50);map.put(C, 100);map.pu…

如何在 CentOS 7 虚拟机上配置静态 IP 地址并保持重启后 SSH 连接

在使用 CentOS 7 的虚拟机时&#xff0c;我们通常需要配置静态 IP 地址&#xff0c;以确保在每次虚拟机重启后能够通过 SSH 连接。本文将介绍如何在 CentOS 7 系统中配置静态 IP 地址&#xff0c;并确保配置在系统重启后依然生效。 步骤 1&#xff1a;检查虚拟机网络接口 首先…

matlab求解问题

一、目的 掌握Matlab中函数求导、函数极值和极限问题的求解,能够借助Matlab工具对简单优化模型进行求解。 二、内容与设计思想 1、函数求导 1.1求解给定函数的一阶导数&#xff1a;diff(y, x)用于对变量x求y的导数。 1.2求解给定函数的二阶导数&#xff1a;在求出一阶导数的…

C语言斐波那契数列

斐波那契数列&#xff08;Fibonacci sequence&#xff09;&#xff0c;又称黄金分割数列 、兔子数列。由意大利数学家莱昂纳多・斐波那契在 1202 年提出&#xff0c;源于其《算盘书》中一道兔子繁殖问题。定义&#xff1a;在数学上&#xff0c;该数列以递归形式定义。最常见的是…

AI浪潮:开启科技新纪元

AI 的多面应用​ AI 的影响力早已突破实验室的围墙&#xff0c;在众多领域落地生根&#xff0c;成为推动行业变革的重要力量。 在医疗领域&#xff0c;AI 宛如一位不知疲倦的助手&#xff0c;助力医生提升诊疗效率与准确性。通过对海量医学影像的深度学习&#xff0c;AI 能够快…

Ansys 计算刚柔耦合矩阵系数

Ansys 计算刚柔耦合系数矩阵 文章目录 Ansys 计算刚柔耦合系数矩阵卫星的刚柔耦合动力学模型采用 ANSYS 的 APDL 语言的计算方法系统转动惯量的求解方法参考文献 卫星的刚柔耦合动力学模型 柔性航天器的刚柔耦合动力学模型可以表示为 m v ˙ B t r a n η F J ω ˙ ω J…

算法题(148):排座椅

审题&#xff1a; 本题需要我们找到最佳的排座椅方案&#xff0c;并输出行&#xff0c;列方案 思路&#xff1a; 方法一&#xff1a;简单贪心 由于题目会告诉我们有哪几对的同学会交头接耳&#xff0c;所以我们可以记录下第几行/第几列上可以隔开的同学对数&#xff0c;而题目限…

企业级电商数据对接:1688 商品详情 API 接口开发与优化实践

在数字化浪潮席卷全球的当下&#xff0c;企业级电商平台之间的数据对接已成为提升运营效率、增强市场竞争力的关键环节。作为国内知名的 B2B 电商平台&#xff0c;1688 拥有海量商品资源&#xff0c;通过开发和优化商品详情 API 接口&#xff0c;企业能够快速获取商品信息&…

【Cesium入门教程】第七课:Primitive图元

Cesium丰富的空间数据可视化API分为两部分&#xff1a;primitive API面向三维图形开发者&#xff0c;更底层一些。 Entity API是数据驱动更高级一些。 // entity // 调用方便&#xff0c;封装完美 // 是基于primitive的封装// primitive // 更接近底层 // 可以绘制高级图形 /…

Oracle APEX 必须输入项目标签型号显示位置

1. 正常Oracle APEX中必须输入项目标签的红星显示在标签文字左侧&#xff0c;偏偏项目要求显示在右侧&#xff0c; 加入如下全局CSS代码 .t-Form-label {display: flex;flex-direction: row-reverse;gap: 1px; }以上。

深入理解 TypeScript 中的 unknown 类型:安全处理未知数据的最佳实践

在 TypeScript 的类型体系中&#xff0c;unknown 是一个极具特色的类型。它与 any 看似相似&#xff0c;却在安全性上有着本质差异。本文将从设计理念、核心特性、使用场景及最佳实践等方面深入剖析 unknown&#xff0c;帮助开发者在处理动态数据时既能保持灵活性&#xff0c;又…

项目QT+ffmpeg+rtsp(二)——海康威视相机测试

文章目录 前言一、验证RTSP地址的有效性1.1 使用VLC播放器验证1.2 使用FFmpeg命令行验证1.3 使用Python代码检查网络连接1.4 检查摄像头Web界面1.5 使用RTSP客户端工具二、关于IPV4的地址2.1 原来2.1.1 原因2.2 解决2.3 显示前言 昨晚拿到一个海康威视的相机,是连接上了交换机…

Java-Collections类高效应用的全面指南

Java-Collections类高效应用的全面指南 前言一、Collections 类概述二、Collections 类的基础方法2.1 排序操作2.1.1 sort方法2.1.2 reverse方法2.1.3 shuffle方法 2.2 查找与替换操作2.2.1 binarySearch方法2.2.2 max和min方法2.2.3 replaceAll方法 三、Collections 类的高级应…