【Cpp】类和对象#构造函数 析构函数

标题:【Cpp】类和对象#构造函数 析构函数

@水墨不写bug

(图片来源于网络)


 正文开始:

(一)构造函数

        构造函数是特殊的成员函数,需要注意的是,构造函数虽然名称叫构造,但是构造函数的主要任务并不是开空间创建对象,而是初始化对象。

其特征如下:
1. 函数名与类名相同。
2. 无返回值。(不需写为void)


class A {
public:A()//函数名和类名相同,且不需要写返回值类型{_a = 1;_c = 't';}private:int _a;char _c;stack st1;
};


3. 对象实例化时编译器自动调用对应的构造函数。(自动初始化,省去了Init()函数)

class A {
public:A()//函数名和类名相同{_a = 1;_c = 't';}	
private:int _a;char _c;};
int main()
{A a1;	return 0;
}

(上述程序中,在创建a1后自动调用A(),将_a,_c初始化)
4. 构造函数可以重载。(构造函数可以有多个,也就是对象的初始化方式可以有多个

        简单举一个例子:


class B {
public:B(){_a = 1;_c = 't';_arr = (int*)malloc(sizeof(int));}B(int n){_arr = (int*)malloc(sizeof(int) * n);_a = 1;_c = 't';}private:int _a;char _c;int* _arr;
};int main()
{B b1;B b2(100);return 0;
}

 (        b1对象没有传参,调用没有参数的构造函数;b2传了一个参数n,调用有一个参数的默认构造,可以指定开辟空间的大小

        但是对于下面的重载,情况就有所不同了:


class B {
public:B(){_a = 1;_c = 't';_arr = (int*)malloc(sizeof(int));}B(int n = 8){_arr = (int*)malloc(sizeof(int) * n);_a = 1;_c = 't';}private:int _a;char _c;int* _arr;
};

这两个函数显然构成函数重载,因为他们的参数个数不同。但是在不传参调用的时候,会导致编译器报错,因为编译器无法区分无参调用调用的具体是哪一个函数


5. 如果类中没有显式定义构造函数,则C++编译器会自动生成一个无参的默认构造函数,一旦用户显式定义编译器将不再生成。


6.对于自动生成的默认构造函数,有如下性质:

        i,自定义类型(int,float,int*等)不做处理,仍然是随机值;

        ii,对于自定义类型(struct,class声明中的类),转跳到这个自定义类型的对应的构造函数中去,自动调用自定义类型的构造函数。

7.什么是默认构造,总结下来有如下几种情况:

        i,自己没有写,编译器自动生成的的构造函数是无参数的构造函数,也就是默认构造;

        ii,自己写了一个函数,但是没有参数,也可以被编译器识别为默认的构造函数,这时编译器就不会再自动生成一个构造函数了;

        iii,自己写了一个函数,有参数,但是是全缺省的参数,这也可被编译器识别为默认的构造函数,这时编译器就不会再自动生成一个构造函数了;

(注意:无参构造函数、全缺省构造函数、我们没写编译器默认生成的构造函数,都可以认为是默认构造函数。但是要注意编译器生成的构造函数不会处理内置类型)

(二)析构函数

        析构函数:与构造函数功能相反,析构函数不是完成对对象本身的销毁,局部对象销毁工作是由编译器完成的。而对象在销毁时会自动调用析构函数,完成对象中资源的清理工作。

析构函数是特殊的成员函数,其特征如下:
1. 析构函数名是在类名前加上字符 ~。(~表示取反,暗示了清理资源的工作)
2. 无参数无返回值类型。(无需写void)

class stack{
public:stack(int n = 4)//函数名和类名相同{_arr = (int*)malloc(sizeof(int) * n);_top = 0;_capacity = 0;}~stack()//函数名和类名相同,不需要写返回值类型{free(_arr);_top = 0;_capacity = 0;}
private:int* _arr;int _top;int _capacity;
};


3.对象生命周期结束时,C++编译系统系统自动调用析构函数。


4.一个类只能有一个析构函数。若未显式定义,系统会自动生成默认的析构函数。注意:析构函数不能重载,也就是说析构只有一种方式。


5.对于自动生成的析构函数,有如下性质:

        i,对于自定义类型(int,float,int*等)不做处理,自定义类型本身不需要资源的释放;

        ii,对于自定义类型(struct,class声明中的类),转跳到这个自定义类型的对应的析构函数中去,自动调用自定义类型的析构函数。

6.从上述特性可以得出:如果类中没有申请资源时,析构函数可以不写,直接使用编译器生成的默认析构函数,比如Date类;有资源申请时,一定要写析构函数,否则会造成资源泄漏,比如Stack类。

总结:

        默认生成虽然好,但是如果默认生成的构造/析构函数在调用时由于只处理自定义类型,如果自定义类型的构造/析构没有写,那么即使是默认生成的函数,本质上也是没有做任何工作。

class stack{
public:stack(int n = 4)//函数名和类名相同{_arr = (int*)malloc(sizeof(int) * n);_top = 0;_capacity = 0;}/*~stack(){free(_arr);_top = 0;_capacity = 0;}*/
private:int* _arr;int _top;int _capacity;
};class A {
public:A()//函数名和类名相同{_a = 1;_c = 't';}private:int _a;char _c;stack st1;
};

(虽然A类没有写析构,但是编译器会默认生成,处理A中需要释放的资源st1;但是st1的类没有写析构函数,也只是调用默认生成的析构,这时,st1中的动态申请的堆空间就无法释放了,造成内存泄漏)

        所以,我们能自己写的构造/析构,就最好自己写,不要过分依靠编译器默认生成。 


完·~ 

未经作者同意禁止转载

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

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

相关文章

区块链 | IPFS:Merkle DAG(进阶版)

🦊原文:Merkle DAGs: Structuring Data for the Distributed Web 🦊写在前面:本文属于搬运博客,自己留存学习。 1 Merkle DAG 当我们在计算机上表示图时,必须通过提供节点和边的具体表示来编码我们的数据…

常用SQL命令

应用经常需要处理用户的数据,并将用户的数据保存到指定位置,数据库是常用的数据存储工具,数据库是结构化信息或数据的有序集合,几乎所有的关系数据库都使用 SQL 编程语言来查询、操作和定义数据,进行数据访问控制&…

yudao-cloud微服务系统系统模块+后台管理系统成功运行

🌹作者主页:青花锁 🌹简介:Java领域优质创作者🏆、Java微服务架构公号作者😄 🌹简历模板、学习资料、面试题库、技术互助 🌹文末获取联系方式 📝 系列文章目录 第一章 芋…

C语言之位操作符:<<、>>、、|、^、~,以及原码反码补码和例题详解

目录 前言 一、原码、反码、补码 二、移位操作符 三、位操作符&#xff1a;&、|、^、~ 四、经典例题分析&#xff1a; 总结 前言 本文将详细介绍C语言中左移操作符<<&#xff0c;右移操作符>>&#xff0c;按位与&&#xff0c;按位或|&#xff0c;按位异或^…

【Spring AI】09. ETL 管道

文章目录 ETL PipelineAPI 概述入门指南ETL 接口和实现DocumentReaderJsonReaderTextReaderPagePdfDocumentReaderParagraphPdfDocumentReaderTikaDocumentReader DocumentTransformerTextSplitterTokenTextSplitterContentFormatTransformerKeywordMetadataEnricherSummaryMet…

【通信中间件】Fdbus HelloWorld实例

Fdbus实例教程 Fdbus简介 Fdbus 全称 Fast Distributed Bus&#xff08;高速分布式总线&#xff09;&#xff0c;提供IPCRPC功能。适用于多种OS&#xff1a; LinuxQNXAnroidOSWindow Fdbus本质是Socket&#xff0c;IPC基于Unix domain socket&#xff0c;RPC基于TCP。使用G…

MathType打开的窗口太多 MathType说打开窗口太多无法复制怎么解决

在数学文档编辑中&#xff0c;MathType作为一款常用的数学公式编辑工具&#xff0c;使用过程中&#xff0c;我们常常会遇到一些问题&#xff0c;比如MathType打开的窗口过多导致软件运行缓慢甚至崩溃&#xff0c;以及在复制过程中出现“打开窗口太多&#xff0c;无法复制”的提…

241 基于matlab的Dijkstra算法进行路径规划

基于matlab的Dijkstra算法进行路径规划。可根据实际情况输入障碍物和起止点坐标信息&#xff1b; 输出避碰最短路径&#xff1b; 能够利用切线图算法对障碍物区域进行环境建模&#xff0c;设置障碍物的位置和区域。利用Dijkstra算法进行路径规划。程序已调通&#xff0c;可直接…

细说SVPWM原理及软件实现原理,关联PWM实现

细说SVPWM原理及软件实现原理&#xff0c;关联PWM实现 文章目录 细说SVPWM原理及软件实现原理&#xff0c;关联PWM实现1. 前言2. 基础控制原理回顾2.1 FOC 原理回顾2.2 细说 SVPWM2.2.1 矢量扇区计算2.2.2 矢量作用时间计算 2.2.3 如何理解 U4 U6 2/3Udc?2.2.4 如何理解 U4m…

文件传送协议

壹、文件传输协议FTP 一、FTP简介 文件传送协议FTP曾是互联网上使用最广泛的协议&#xff1b; 在互联网发展的早期阶段&#xff0c;用FTP传送文件约占整个互联网的通信量的三分之一&#xff1b;知道1995年&#xff0c;www的通信量才首次超过FTP。 FTP实现的是通过网络实现异…

GaussDB数据库事务管理

一、引言 事务管理是数据库系统中至关重要的一部分&#xff0c;它确保了数据库的一致性和可靠性。在GaussDB数据库中&#xff0c;事务管理不仅遵循传统的ACID特性&#xff0c;还提供了一些高级功能。本文将深入探讨GaussDB数据库事务管理的各个方面。 二、事务的基本概念 2.1…

机器学习:深入解析SVM的核心概念【四、软间隔与正则化】

软间隔与正则化 问题一&#xff1a;优化目标函数是如何得到的&#xff1f;得到的过程是怎样的&#xff1f;问题二&#xff1a;拉格朗日乘子法计算详细过程问题三&#xff1a;KKT条件求解过程问题四&#xff1a;结构风险最小化&#xff08;SRM&#xff09;的原理 在前面的讨论中…

Rust Turbofish 的由来

0x01 什么是 Turbofish 我们运行如下 Rust Snippet&#xff1a; fn main() {let numbers: Vec<i32> vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10];let even_numbers numbers.into_iter().filter(|n| n % 2 0).collect();println!("{:?}", even_numbers); }不出意…

Android 设置头像 - 相册拍照

Android开发在个人信息管理中&#xff0c;如果设置头像&#xff0c;一般都提供了从相册选择和拍照两种方式。下午将针对设置用户头像相册和拍照两种方式的具体实现进行详细说明。 在实际实现过程中需要使用到权限管理&#xff0c;新版本的Android需要动态申请权限&#xff0c;权…

React Context

Context https://juejin.cn/post/7244838033454727227?searchId202404012120436CD549D66BBD6C542177 context 提供了一个无需为每层组件手动添加 props, 就能在组件树间进行数据传递的方法 React 中数据通过 props 属性自上而下(由父及子)进行传递&#xff0c;但此种用法对…

Matlab|二阶锥松弛在配电网最优潮流计算中的应用

目录 一、主要内容 二、部分代码 三、程序代码 四、下载链接 一、主要内容 最优潮流计算是电网规划、优化运行的重要基础。首先建立了配电网全天有功损耗最小化的最优潮流计算模型&#xff1b;其次结合辐射型配电网潮流特点建立支路潮流约束&#xff0c;并考虑配电网中的可…

macOS sonoma 14.4.1编译JDK 12

macOS sonoma 14.4.1编译JDK 12 环境参考文档开始简述问题心路历程着手解决最终解决(前面有点啰嗦了&#xff0c;可以直接看这里) 记录一次靠自己看代码解决问题的经历(总之就是非常开心)。 首先&#xff0c;先diss一下bing&#xff0c;我差一点就放弃了。 环境 macOS sonom…

[力扣]——125.验证回文串

class Solution {public static boolean isValidChar(char ch){if((ch > a && ch < z) ||(ch > 0 && ch < 9)){return true;}return false;}public boolean isPalindrome(String s) {// 将大小写统一起来s s.toLowerCase();int left 0, right s…

vulnhub靶场之FunBox-2

一.环境搭建 1.靶场描述 Boot2Root ! This can be a real life scenario if rockies becomes admins. Easy going in round about 15 mins. Bit more, if you are find and stuck in the rabbit-hole first. This VM is created/tested with Virtualbox. Maybe it works with…

百面算法工程师 | 支持向量机——SVM

文章目录 15.1 SVM15.2 SVM原理15.3 SVM解决问题的类型15.4 核函数的作用以及特点15.5 核函数的表达式15.6 SVM为什么引入对偶问题15.7 SVM使用SGD及步骤15.8 为什么SVM对缺失数据敏感15.9 SVM怎么防止过拟合 欢迎大家订阅我的专栏一起学习共同进步 祝大家早日拿到offer&#x…