news 2026/3/23 22:04:41

《类和对象中》的构造函数和析构函数的内容

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
《类和对象中》的构造函数和析构函数的内容

构造函数:

这里的构造函数本质上就是你在C语言中的初始化函数,用于各种类型的初始化,既可以适用于内置类型,同样适用于自定义类型。

模板:

类名 (参数)——

{

}

比如

class stack

{
public:

stack(int capacity = 4)

{

_capacity = capacity;

num = 0;

_arr = (int*)malloc(sizeof(int)* _capacity);

}

private:

int *_arr;

int _num;

int _capacity;

};

其中构造函数是这一段,

stack(int capacity = 4)

{

_capacity = capacity;

num = 0;

_arr = (int*)malloc(sizeof(int)* _capacity);

}

可以观察到的是,这个构造函数没有返回类型!!cpp中使用这个方法来确认出这个是构造函数,以后只要你使用了这个类型时,系统就会自动执行这个构造函数,即初始化!

如果你没有写的时候,系统就会调用系统的默认构造函数,如果你的成员时内置类型,根据编译器的区别,有的会帮你初始化成为0,有的就是随机值。但对于成员是自定义类型的,你不写构造函数就会报错。

默认构造函数指的是不用参数就可以调用的构造函数,而并非是指系统默认的构造函数!!!系统默认的构造函数时默认构造函数的一部分。三个默认构造函数只能同时存在一个,否则会出现识别错误。

2.析构函数

讲完了构造函数——对应C语言中的初始化函数,现在就来讲析构函数——对应函数中的销毁函数。

~类名()——在类名前加一个 ~ 就是析构函数,同样会自动执行,执行时间为:该类型的变量生命周期的结束时刻。对于多个同类型的变量同时销毁,依次执行晚定义变量的销毁函数。

{

};

这里同样存在这一个你没写的问题,如果你没写,系统同样会执行一个自动销毁函数,如果你申请了内存,没写,系统默认的析构函数没帮你释放内存,就会造成内存泄漏!!

所以只要你在前面构造函数中申请了资源就要写,反之,可以不用写。

e.g

class stack

{
public:

stack(int capacity = 4)

{

_capacity = capacity;

num = 0;

_arr = (int*)malloc(sizeof(int)* _capacity);

~stack()

{

free(_arr);

_num = _capacity = 0;

}

private:

int *_arr;

int _num;

int _capacity;

};

这一段就是析构函数

~stack()

{

free(_arr);

_num = _capacity = 0;

}

因为很明显的是我们在构造函数中申请了内存,所以我们在这里就要写一个析构函数

3.拷贝构造函数

从名字可以看出这个是一个构造函数,一个特殊的构造函数!这个的应用差不多可以想成strncpy/strcpy/memcpy作用相似,是把一个已经存在的变量用来初始化另一个变量。

结构:

类名(const 类名&名称)——这里讲究很多,比如为什么要用引用,不用行不行?这个问题就会引出更多的问题,如果不行,为什么?涉及到传参的本质。这里要是讲明白就会太浪费篇幅,我会单独另开一篇文章来仔细分析这个现象。

比如

class stack

{
public:

stack(int capacity = 4)

{

_capacity = capacity;

num = 0;

_arr = (int*)malloc(sizeof(int)* _capacity);

stack(const stack& st)

{

_capacity = st._capacity;

_num = st._num;

_arr = (int*)malloc(sizeof(int)*_capacity);——这里不能直接 _arr = st._arr;因为这相当于把你开辟的空间的地址直接给他了,后面这两个变量进行操作时会相互干扰!!所以我们单独申请一片空间

memmove(_arr,st._arr,sizeof(int)*_capacity);

}

~stack()

{

free(_arr);

_num = _capacity = 0;

}

private:

int *_arr;

int _num;

int _capacity;

};

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/13 7:13:16

【CMake】`add_executable()` 命令详解

add_executable() 是 CMake 中用于创建可执行文件目标的核心命令&#xff0c;它将源代码文件编译链接成可执行程序。 基本语法 1. 普通可执行文件 add_executable(<target> [WIN32] [MACOSX_BUNDLE][EXCLUDE_FROM_ALL]source1 [source2 ...])2. 导入的可执行文件 add_exe…

作者头像 李华
网站建设 2026/3/18 14:41:49

终极指南:3步掌握Fairseq神经机器翻译实战技巧

终极指南&#xff1a;3步掌握Fairseq神经机器翻译实战技巧 【免费下载链接】fairseq 项目地址: https://gitcode.com/gh_mirrors/fai/fairseq Fairseq作为PyTorch生态中备受推崇的序列建模工具包&#xff0c;在神经机器翻译领域展现出卓越的性能。无论您是希望快速部署…

作者头像 李华
网站建设 2026/3/19 5:45:09

YOLOv11 目标检测全流程 mastery 教程:从原理到实战,让你成为检测达人

文章目录 YOLOv11 目标检测全流程 mastery 教程:从原理到实战,让你成为检测达人 一、YOLOv11 核心架构:革新设计带来的性能飞跃 1. Backbone:特征提取的“超级引擎” 2. Neck:特征融合的“智能枢纽” 3. Head:检测输出的“精准射手” 二、环境搭建:零基础也能快速启动 1…

作者头像 李华
网站建设 2026/3/13 8:15:28

5分钟免费掌握高效电路模拟器:从零开始搭建电子世界

5分钟免费掌握高效电路模拟器&#xff1a;从零开始搭建电子世界 【免费下载链接】circuitjs1 Electronic Circuit Simulator in the Browser 项目地址: https://gitcode.com/gh_mirrors/cir/circuitjs1 还在为电路实验烦恼吗&#xff1f;想要一个随时可用的电子实验室吗…

作者头像 李华
网站建设 2026/3/13 6:46:10

Whisper-CTranslate2:4倍速语音识别与翻译终极指南

Whisper-CTranslate2&#xff1a;4倍速语音识别与翻译终极指南 【免费下载链接】whisper-ctranslate2 Whisper command line client compatible with original OpenAI client based on CTranslate2. 项目地址: https://gitcode.com/gh_mirrors/wh/whisper-ctranslate2 在…

作者头像 李华
网站建设 2026/3/17 1:57:13

Minimal Twitter:重新定义你的社交媒体纯净体验

Minimal Twitter&#xff1a;重新定义你的社交媒体纯净体验 【免费下载链接】minimal-twitter Minimal Theme for Twitter - Refine and Declutter Your Twitter Web Experience 项目地址: https://gitcode.com/gh_mirrors/mi/minimal-twitter 在信息过载的时代&#xf…

作者头像 李华