C++ 初阶 类和对象(中)

news2024/12/27 3:49:17

前言:C++初阶系列,每一期博主都会使用简单朴素的语言将对应的知识分享给大家,争取让所有人都可以听懂,C++初阶系列会持续更新,上学期间将不定时更新,但总会更的

目录

一、构造函数

1.1为什么要有构造函数?

1.2构造函数的特性

1.3使用构造函数 

1.4内置类型和自定义类型在构造方面的细节

二、析构函数

1.为什么要有析构函数?

2.析构函数的特性

3.使用析构函数

三、下期预告


一、构造函数

1.1为什么要有构造函数?

在C语言的学习中,我们创建一个结构体变量之后所做的第一件事就是初始化结构体变量,我们往往会为此写上一个初始化函数,Init+被初始化的结构体名字。就拿顺序表来说,我们初始化顺序表就会写上一个InitSeqlist之类的函数。但是我们写了有时也会忘记使用它,哈哈,是不是蚌埠住了,但这就是我们经常会犯的错误,这往往会造成我们的程序与预期不符,举个例子,我们在初始化顺序表的时候应该要将顺序表首元素的指针置空或开空间,但我们若是忘记置空或者忘记开空间,就会导致我们访问到野指针,会造成不可预料的后果。

因此在C++中就诞生了一个超级好用的东西,它就是构造函数,它的作用也是很简单粗暴,那就是在你创建了一个对应的类(结构体)的时候,编译器会根据你书写的构造函数对你创建的类进行初始化。妈妈再也不用当心我忘记初始化类了~

1.2构造函数的特性

1. 无返回值。
2.函数名与类名相同。
3. 对象实例化时编译器自动调用对应的构造函数。
4. 构造函数可以重载。

先来讲一下第一点,无返回值,这里的无返回值是包括void,也就是连void都不用,直接写构造函数名就行了,这时候我们就会接触到第二点,函数名与类名相同,比方说我们要创建一个关于日期的类,我给这个类取名为Date,那么我的构造函数也得写成类。

第三点也就是之前我们强调的一点,这里就不再赘述。第四点则代表了构造函数的可塑性,它是可以重载的,那么也就代表着它能够更加灵活地根据我们的需求去构造。对于重载不是很理解的小伙伴可以去看看博主写的这篇文章。C++初阶 入门(2)-CSDN博客

1.3使用构造函数 

我们拿关于日期的类举例子,年月日基本变量创建一下,再写一个构造函数和打印函数,但需要注意的一点就是构造函数的创建必须要有默认构造函数,否则在你不传变量的时候,编译器没法对其进行简单地初始化,编译器就会报下图所示错误。

什么是默认构造函数?在我看来一共有三种

1.在构造函数中写入缺省值,实现全缺省,这样就可以实现创建无参数变量依然可以初始化变量

2.使用重载的方式来缺省 

 3.在声明的同时进行初始化 

值得一提的是,如果你已经写了构造函数,那么编译器就不会采用你写的声明,而是会去直接调用你写的构造函数,假设你这个构造函数没写完,那就会报错。如图:

屏蔽掉之后就可以正常的使用声明

总结一下:

总的来说,默认构造函数就是指不传参也可以调用的函数,如全缺省。

博主推荐使用方法1来进行构造函数的书写,方法2和方法3写的默认构造函数不是很规矩。

细节:

方法1和方法2不可以同时存在,否则编译器会出现歧义   值得一提的是,方法1和方法2都可以和声明的形式共存,这是因为一旦有了构造函数,编译器就会忽略声明的初始化而去调用构造函数的内容。

1.4内置类型和自定义类型在构造方面的细节

先来说一下什么是内置类型,内置类型就是指语言自带的类型,如int,double,float......自定义类型就很好理解了,就是用户自己定义的类型,如class出来的类。但必须要注意的一点则是,在C++中,编译器会对自定义类型调用它的默认构造函数,而不对内置类型进行处理。

#include<iostream>
#include<stdlib.h>
using namespace std;
class Stack
{
public:
	Stack(int capacity=10)
	{
		_capacity = capacity;
		_top = 0;
		_s = (int*)malloc(sizeof(int)*_capacity);
	}
private:
	int _top;//栈顶元素的位置
	int _capacity;//容量
	int* _s;//栈
};
class test
{
public:
private:
	Stack s1;
	Stack s2;
	int a;
};
int main()
{
	test t1;
}

可以看的出来,test我并没有创建属于它的析构函数,但它自己就去调用了它的自定义类型成员的默认构造函数,使得对应的数据被初始化。有细心的同学可以发现,a也被初始化了,它不应该是随机值吗?我没对它处理啊,是的,它就应该是随机值,但是博主使用的是vs2019这个编译器进行代码的编写,它过于先进了,直接就帮博主优化了,因此看不出现象,而在vs2013写这串代码,这个变量就应该是随机值。感兴趣的小伙伴可以试一下。

二、析构函数

1.为什么要有析构函数?

讲完了构造函数,那么我们就来讲一下析构函数,既然构造函数是令类创建的时候初始化,那么析构函数则是在类的生命域结束的时候将目标清理,也就是destroy,比方说,我们写了一个顺序表,它malloc了一大块空间,那么我们在程序结束之前就应该将这一大块malloc的空间释放掉,避免造成内存泄漏,因此我们需要destroy函数来对一些类进行处理。但还是那句话,写了但忘记用,是常有的事情。因此在C++中,就诞生了一个函数,它就是析构函数,它能够令对应的类出了它的生命域便销毁,从而保证了安全性。

2.析构函数的特性

1. 析构函数名是在类名前加上字符 ~。
2. 无参数无返回值类型。
3. 一若未显式定义,系统会自动生成默认的析构函数。注意:析构函数不能重载
4. 对象生命周期结束时,C++编译系统系统自动调用析构函数。

先来说下第一点,第一点很好理解,就是在类之前在个波浪号~,第二点和构造函数差不多,但更严格,它连参数都不能有,第三点则表示一个类只能有一个析构函数

3.使用析构函数

拿栈来举例

#include<iostream>
#include<stdlib.h>
using namespace std;
class Stack
{
public:
	Stack(int capacity=10)
	{
		_capacity = capacity;
		_top = 0;
		_s = (int*)malloc(sizeof(int) * _capacity);
	}
	~Stack()
	{
		free(_s);
		_s = nullptr;
		_top = 0;
		_capacity = 0;
		cout << "以下为调用析构函数结果" << endl;
		cout << _s << endl;
		cout << _capacity << endl;
		cout << _top << endl;
	}
	void print()
	{
		cout << _s <<endl;
		cout << _capacity << endl;
		cout << _top << endl;
	}
private:
	int* _s;
	int _capacity;
	int _top;
};
int main()
{
	Stack s1;
	s1.print();
}

三、下期预告

下回我们来聊一下拷贝构造函数,运算符重载QAQ 

好了,今天的分享到这里就结束了,感谢各位友友的来访和阅读,祝各位友友们前程似锦O(∩_∩)O 


 

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

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

相关文章

树状数组 and 线段树

目录 &#x1f996;解释 -- 树状数组 &#xff08;一&#xff09;公式 &#xff08;二&#xff09;操作 (1) 求前缀和 (2) 某个位置上的数更新 &#x1f996;解释 -- 线段树 &#x1f33c;1264. 动态求连续区间和 AC 树状 AC 线段树 &#x1f33c;1265. 数星星 暴…

数字化时代,数据仓库是什么?有什么用?

在激烈的市场竞争和全新的数字经济共同作用下&#xff0c;数字化转型成为了大多数企业的共识&#xff0c;也是获取数字经济的最佳方式。在整个数据价值生产链路中&#xff0c;数据仓库的主要作用就是中心化分发&#xff0c;将原始数据与数据价值挖掘活动隔离。 所有的原始数据…

大数据毕业设计选题推荐-自媒体舆情分析平台-Hadoop-Spark-Hive

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

Docker学习路线3:安装设置

Docker提供了一个名为Docker Desktop的桌面应用程序&#xff0c;简化了安装和设置过程。还有另一个选项可以使用Docker引擎进行安装。 Docker Desktop网站Docker引擎 Docker Desktop Docker Desktop是一款易于安装的应用程序&#xff0c;可使开发人员快速在其台式机上设置Do…

IntelliJ IDEA Services工具栏运行不显示端口问题解决

问题 如Spring Boot服务启动时&#xff0c;端口不显示。 解决 1、 清理所有缓存 2、 关闭IntelliJ IDEA后&#xff0c;到C:\Users\&#xff08;你自己的用户名&#xff09;\AppData\Local\Temp路径把所有文件都删除&#xff0c;因为时一个缓存&#xff0c;不影响其他软件…

世微 DC-DC平均电流双路降压恒流驱动器 LED车灯AP2813

产品描述 AP2813 是一款双路降压恒流驱动器,高效率、外 围简单、内置功率管&#xff0c;适用于 5-80V 输入的高精度降 压 LED 恒流驱动芯片。内置功率管输出最大功率可达 12W&#xff0c;最大电流 1.2A。 AP2813 一路直亮&#xff0c;另外一路通过 MODE1 切换 全亮&#xff0c…

推荐PHP付费进群源码

PHP付费进群源码带自动定位基于ThinkPHP框架开发的&#xff0c;可以快速搭建知识付费粉丝进群。 更新&#xff1a; 1.首页付款轮播 2.城市定位功能 3.更新及优化域名库及支付设置 4.新增一张图模板设置模式&#xff0c;简化后台模板设置 5.前后台其他优化 演示地址&#xff1a…

【Linux进程】环境变量

目录 Linux环境变量 基本概念 常见环境变量 查看环境变量方法 测试PATH 测试HOME 和环境变量相关的命令 环境变量的组织方式 通过代码如何获取环境变量 命令行参数 命令行第三个参数 通过第三方变量environ获取 通过系统调用获取或设置环境变量 ​编辑环境变量通…

【ML】分类问题

分类问题 classification&#xff1a;根据已知样本特征&#xff0c;判断输入样本属于哪种已知样本类。 常用入门案例&#xff1a;垃圾邮件检测、图像分类、手写数字识别、考试通过预测。 分类问题和回归问题的明显区别&#xff1a; 分类问题的结果是非连续型标签&#xff0c…

绝地求生msvcp140.dll丢失报错怎么办,这四个方法都可以解决

在回答这个问题之前&#xff0c;我们先来了解一下什么是msvcp140.dll。msvcp140.dll是微软Visual C 2015 Redistributable的一个组件&#xff0c;它包含了许多运行库文件&#xff0c;用于支持各种应用程序的正常运行。当你在玩《绝地求生》&#xff08;俗称“吃鸡”&#xff09…

网工内推 | 知名港企,需精通粤语,8-10年工作经验,最高60k

01 深圳市网新新思软件有限公司 招聘岗位&#xff1a;网络工程师 职责描述&#xff1a; 1、制定和执行网络设计、搭建、配置、优化、调整的实施方案&#xff1b; 2、负责网络运维保障工作&#xff0c;包括网络设备的定期巡检、一般网络异常处理、网络调试等日常运行及技术支持…

RHCSA --- 第二天

一、查看IP地址 [rootlocalhost ~] ip ad 对应四张网卡 第一张&#xff1a;环回网卡&#xff08;用于测试&#xff09; 第二张&#xff08;主要&#xff09;&#xff1a;以太网网卡&#xff08;ens160&#xff09; 2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP>…

【教3妹学编程-算法题】117. 填充每个节点的下一个右侧节点指针 II

2哥 : 3妹&#xff0c;听说你昨天去面试了&#xff0c;怎么样啊&#xff1f; 3妹&#xff1a;嗨&#xff0c;别提了&#xff0c;让我回去等通知&#xff0c;估计是没有通知了&#xff0c; 还浪费我请了一天假。 2哥 : 你又请假了啊&#xff0c; 你是怎么跟你那个严厉的老板请假…

第二证券:央行、外汇局:实施差别化住房信贷政策;富士康辟谣…

重要的音讯有哪些 国务院附和在海南自贸港暂时调整实施有关行政法规规矩 国务院发布关于附和在海南自由贸易港暂时调整实施有关行政法规规矩的批复。为支撑海南自由贸易港制造&#xff0c;依照《海南自由贸易港制造总体计划》&#xff0c;附和自即日起在海南自由贸易港暂时调…

SAP 销售订单需求 运行MRP 跑不出计划订单? 策略组40

SAP 销售订单需求 运行MRP 跑不出计划订单&#xff1f; 策略组40 1.物料3.1.10101.00098策略组维护40&#xff0c;其他主数据维护完整。 2.VA01创建销售订单10000366 3.MD02运行MRP如图&#xff0c;没有跑出计划订单。这里显然有点问题&#xff0c;40策略&#xff0c;会根据…

vue-admin-templete项目配置在手机上预览

参考文档&#xff1a; https://blog.csdn.net/qq_29752857/article/details/109802801想要在手机上预览本地打开的vue-admin-templete项目&#xff0c;首先要确保手机和电脑在同一网段。 参考文档&#xff1a;https://blog.csdn.net/m0_57236802/article/details/1315234471.查…

一.基本的select语句

目录 一.SQL分类二.SQL语言的规则与规范三.基本的SELECT语句四.显示表结构五.过滤数据 一.SQL分类 SQL语言在功能上主要分为如下3大类: DDL&#xff08;Data Definition Languages、数据定义语言&#xff09;&#xff0c;这些语句定义了不同的数据库、表、视图、索引等数据库对…

家用洗地机哪个牌子质量最好?家用洗地机推荐

洗地机也就是集吸尘器&#xff0c;拖地&#xff0c;洗地&#xff0c;功能于一体的家电&#xff0c;无论干湿垃圾都能清理的干干净净&#xff0c;而且还不用弯腰&#xff0c;有的只用换个头&#xff0c;就从拖地变成了吸尘器和除螨仪简直就是清洁家里卫生的打扫神器啦!那么面对市…

【Python基础知识二】数据类型转换等

Python基础知识&#xff1a;数据类型转换 1 Python数据类型转换1.1 隐式类型转换1.2 显式类型转换1.2.1 int() 强制转换为整型1.2.2 float() 强制转换为浮点型1.2.3 str() 强制转换为字符串类型1.2.4 其他函数 1.3 数据类型的高低之分1.4 不同数据类型之间能否随意转化 参考 1 …

hadoop进程启停管理(看这一篇就足够了!)

一、一键启停脚本 Hadoop HDFS组件内置了HDFS集群的一键启停脚本 $HADOP_HOME/sbin/start-all.sh,一键启动HDFS集群 执行原理&#xff1a; 在执行此脚本的机器上&#xff0c;启动SecondaryNameNode 读取core-site.xml内容(fs.defaultFS项)&#xff0c;确认NameNode所在机器&…