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

news2025/5/20 7:32:52

目录

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.coloradmin.cn/o/2378630.html

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

相关文章

Day 16

目录 1.JZ79 判断是不是平衡二叉树1.1 解析1.2 代码 2.DP10 最大子矩阵2.1 解析2.2 代码 1.JZ79 判断是不是平衡二叉树 JZ79 判断是不是平衡二叉树 dfs 1.1 解析 1.2 代码 /*** struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* TreeNode(in…

摄影构图小节

1、三分构图法 三分构图法即将画面横竖各分为三份&#xff0c;即九宫格形式。 将画面用两条竖线和两条横线分割&#xff0c;就如同是书写中文的【井】字。这样就可以得到4个交叉点&#xff0c;然后再将需要表现的重点放置在4个交叉点中的一个附近即可。 拍摄自然风光时&#xf…

DAY 28 类的定义和方法

知识点回顾&#xff1a; 类的定义pass占位语句类的初始化方法类的普通方法类的继承&#xff1a;属性的继承、方法的继承 比如def、class这些定义的关键词后&#xff0c;必须有一个有占据缩进位置的代码块。 还有下面这些依赖缩进的语句&#xff0c;都可以用pass语句来占位 x 1…

RAG数据处理:PDF/HTML

RAG而言用户输入的数据通常是各种各样文档&#xff0c;本文主要采用langchain实现PDF/HTML文档的处理方法 PDF文档解析 PDF文档很常见格式&#xff0c;但内部结构常常较复杂&#xff1a; 复杂的版式布局多样的元素&#xff08;段落、表格、公式、图片等&#xff09;文本流无…

机器学习 day04

文章目录 前言一、线性回归的基本概念二、损失函数三、最小二乘法 前言 通过今天的学习&#xff0c;我掌握了机器学习中的线性回归的相关基本概念&#xff0c;包括损失函数的概念&#xff0c;最小二乘法的理论与算法实现。 一、线性回归的基本概念 要理解什么是线性回归&…

蓝牙耳机什么牌子好?倍思值得冲不?

最近总被问“蓝牙耳机什么牌子好”&#xff0c;作为踩过无数坑的资深耳机党&#xff0c;必须安利刚入手的倍思M2s Pro主动降噪蓝牙耳机&#xff01;降噪、音质、颜值全都在线&#xff0c;性价比直接拉满。 -52dB降噪&#xff0c;通勤摸鱼神器 第一次开降噪就被惊到&#xff01…

机器学习-人与机器生数据的区分模型测试-数据处理 - 续

这里继续 机器学习-人与机器生数据的区分模型测试-数据处理1的内容 查看数据 中1的情况 #查看数据1的分布情况 one_ratio_list [] for col in data.columns:if col city or col target or col city2: # 跳过第一列continueelse:one_ratio data[col].mean() # 计算1值占…

ESP系列单片机选择指南:结合实际场景的最优选择方案

前言 在物联网(IoT)快速发展的今天&#xff0c;ESP系列单片机凭借其优异的无线连接能力和丰富的功能特性&#xff0c;已成为智能家居、智慧农业、工业自动化等领域的首选方案。本文将深入分析各款ESP芯片的特点&#xff0c;结合典型应用场景&#xff0c;帮助开发者做出最优选择…

特斯拉虚拟电厂:能源互联网时代的分布式革命

在双碳目标与能源转型的双重驱动下&#xff0c;特斯拉虚拟电厂&#xff08;Virtual Power Plant, VPP&#xff09;通过数字孪生技术与能源系统的深度融合&#xff0c;重构了传统电力系统的运行范式。本文从系统架构、工程实践、技术挑战三个维度&#xff0c;深度解析这一颠覆性…

【Linux笔记】nfs网络文件系统与autofs(nfsdata、autofs、autofs.conf、auto.master)

一、nfs概念 NFS&#xff08;Network File System&#xff0c;网络文件系统&#xff09; 是一种由 Sun Microsystems 于1984年开发的分布式文件系统协议&#xff0c;允许用户通过网络访问远程计算机上的文件&#xff0c;就像访问本地文件一样。它广泛应用于 Unix/Linux 系统&a…

博客打卡-求解流水线调度

题目如下&#xff1a; 有n个作业&#xff08;编号为1&#xff5e;n&#xff09;要在由两台机器M1和M2组成的流水线上完成加工。每个作业加工的顺序都是先在M1上加工&#xff0c;然后在M2上加工。M1和M2加工作业i所需的时间分别为ai和bi&#xff08;1≤i≤n&#xff09;。 流水…

数据库blog1_信息(数据)的处理与效率提升

&#x1f33f;信息的处理 &#x1f342;实际中离不开信息处理 ● 解决问题的建模 任何对问题的处理都可以看作数据的输入、处理、输出。 eg.一个项目中&#xff0c;用户点击信息由前端接收传递到后端处理后返回结果eg.面对一个问题&#xff0c;我们在搜集信息后做出处理与分析…

布隆过滤器介绍及其在大数据场景的应用

目录 布隆过滤器&#xff08;Bloom Filter&#xff09;介绍一、布隆过滤器的基本原理插入元素过程&#xff1a;查询元素过程&#xff1a; 二、布隆过滤器的特点三、误判率计算四、举例说明五、总结 Python版的简单布隆过滤器实现示例一、简单布隆过滤器Python示例二、布隆过滤器…

Fidder基本操作

1.抓取https请求 Fidder默认不能抓取https请求&#xff0c;我们必须通过相应的设置才能抓取https请求 1.选择tools下的option 2.选择https选项&#xff0c;并且勾选下面的选项 3.点击Actions导出信任证书到桌面(expert root certificate to desktop) 4.在浏览器中添加对应的证…

项目管理进阶:精读 78页华为项目管理高级培训教材【附全文阅读】

本文概述了华为项目管理&#xff08;高级&#xff09;课程的学习目标及学习方法。学习该课程后&#xff0c;学员应能&#xff1a; 1. **深刻理解项目管理**&#xff1a;掌握项目管理的基本概念与方法&#xff0c;构建项目管理思维框架。 2. **应用IBEST理念**&#xff1a;结合I…

[Java] 方法和数组

目录 1. 方法 1.2 什么是方法 1.2 方法的定义 1.3 方法的调用 1.4 方法的重载 1.5 递归 2. 一维数组 2.1 什么是数组 2.2 数组的创建 2.3 数组的初始化 2.4 遍历数组 2.5 引用数据类型 2.6 关于null 2.7 数组转字符串 2.8 数组元素的查找 2.9 数组的排序 2.10…

微软家各种copilot的AI产品:Github copilot、Microsoft copilot

背景 大家可能听到很多copilot&#xff0c;比如 Github Copilot&#xff0c;Microsoft Copilot、Microsoft 365 Copilot&#xff0c;有什么区别 Github Copilot&#xff1a;有网页版、有插件&#xff08;idea、vscode等的插件&#xff09;&#xff0c;都是面向于程序员的。Mi…

回溯法理论基础 LeetCode 77. 组合 LeetCode 216.组合总和III LeetCode 17.电话号码的字母组合

目录 回溯法理论基础 回溯法 回溯法的效率 用回溯法解决的问题 如何理解回溯法 回溯法模板 LeetCode 77. 组合 回溯算法的剪枝操作 LeetCode 216.组合总和III LeetCode 17.电话号码的字母组合 回溯法理论基础 回溯法 回溯法也可以叫做回溯搜索法&#xff0c;它是一…

【进程控制二】进程替换和bash解释器

【进程控制二】进程替换 1.exec系列接口2.execl系列2.1execl接口2.2execlp接口2.3execle 3.execv系列3.1execv3.2总结 4.实现一个bash解释器4.1内建命令 通过fork创建的子进程&#xff0c;会继承父进程的代码和数据&#xff0c;因此本质上还是在执行父进程的代码 进程替换可以将…

JavaScript 的编译与执行原理

文章目录 前言&#x1f9e0; 一、JavaScript 编译与执行过程1. 编译阶段&#xff08;发生在代码执行前&#xff09;✅ 1.1 词法分析&#xff08;Lexical Analysis&#xff09;✅ 1.2 语法分析&#xff08;Parsing&#xff09;✅ 1.3 语义分析与生成执行上下文 &#x1f9f0; 二…