【C++】类和对象(三)构造与析构

文章目录

  • 一、类的6个默认成员函数
  • 二、 构造函数
    • 干嘛的?
    • 语法定义
    • 特性
      • 综上总结
      • 什么是默认构造函数?
  • 三、析构函数
    • 干嘛的 ?
    • 语法定义
    • 析构顺序

一、类的6个默认成员函数

如果一个类中什么成员都没有,简称为空类。空类中并不是真的什么都没有。任何类在什么都不写时,编译器会自动生成以下6个默认成员函数。
默认成员函数:用户没有显式实现,编译器会生成的成员函数称为默认成员函数。

在这里插入图片描述

二、 构造函数

干嘛的?

构造函数是特殊的成员函数 用来初始化对象

语法定义

1️⃣函数名和类名相同
2️⃣没有返回值(不需要写)
代码演示:

class Date
{
public://函数名与类名相同 没有返回值 不用写void Date(){_year = 1;_month = 1;_day = 1;}void Print(){cout << _year << "-" << _month << "-" << _day << endl;}private:int _year;int _month;int _day;
};int main()
{Date d1;d1.Print();return 0;
}

3️⃣对象实例化时 编译器自动调用该函数,如果没有构造函数可调,会报错。
反汇编演示自动调用:
在这里插入图片描述
4️⃣构造函数可以重载(重载:函数名相同,参数不同)

class Date
{
public:Date(){_year = 1;_month = 1;_day = 1;}//构造函数可以重载Date(int year, int month , int day ){_year = year;_month = month;_day = day;}void Print(){cout << _year << "-" << _month << "-" << _day << endl;}private:int _year;int _month;int _day;
};int main()
{Date d1;d1.Print();Date d2(2024, 1, 27);d2.Print();return 0;
}

在这里插入图片描述

注意:无参的构造函数 和 全缺省的构造函数 可以同时存在类的定义里,但一般不这样写,因为调用会存在 歧义。

class Date
{
public://无参的构造函数Date(){_year = 1;_month = 1;_day = 1;}//全缺省的构造函数Date(int year = 1, int month = 1, int day = 1){_year = year;_month = month;_day = day;}
private:int _year;int _month;int _day;
};int main()
{Date d1;Date d2(2024, 1, 27);return 0;
}

比如会出现如下报错:
在这里插入图片描述
构造函数可以带参数、也可以不带参数
带参数的情况:实例化对象时,直接把参数跟在对象后面就可以。
无参数的情况:实例化对象时,不能跟空括号()在对象后面,原因是:改写法无法跟函数声明区分开。

实践中,更多的情况直接用全缺省的构造函数

特性

思考下面的日期类我们没提供构造函数的情况是否会被初始化?

class Date
{
public:void Print(){cout << _year << "-" << _month << "-" << _day << endl;}private:int _year;int _month;int _day;
};int main()
{Date d1;d1.Print();
}

在这里插入图片描述

1、构造函数 ,是默认成员函数,程序员不写,编译器会生成一个,但是自动生成的构造函数初始化出的成员变量没有默认值(具体根据成员变量的类型而定)。

tips:C++ 中 数据类型分为

内置类型(基本类型): int /char /doube/指针… 语言自身定义的类型
自定义类型: struct /class

C++98 规定 ,编译器自动生成的 构造函数 对于内置类型不做处理,自定义类型会去调用他的默认构造函数。
演示代码:

class A
{
public:A(){cout << "A()" << endl;_a = 0;}
private:int _a;
};class Date
{
public:void Print(){cout << _year << "-" << _month << "-" << _day << endl;}private:// 内置类型 不做处理int _year ;int _month ;int _day;// 自定义类型 调默认构造A _aa;
};
int main()
{Date d1;d1.Print();
}

在这里插入图片描述

C++11 委员会对这个语法进行打补丁,对于内置类型 在成员变量声明位置 可以给缺省值 ,编译器自动生成的构造函数就会用程序员给出的这个缺省值初始化成员变量。

class A
{
public:A(){cout << "A()" << endl;_a = 0;}
private:int _a;
};class Date
{
public:void Print(){cout << _year << "-" << _month << "-" << _day << endl;}private:// C++11 内置类型 声明位置可以给缺省值int _year =1;int _month =1;int _day;// 自定义类型 调默认构造A _aa;
};
int main()
{Date d1;d1.Print();
}

在这里插入图片描述

综上总结

编译器自动生成的构造函数 在进行对象实例化时 对成员变量的初始化操作:

若成员变量是内置类型:编译器不做处理,程序员可以在成员变量声明位置 可以给缺省值 ,编译器自动生成的构造函数就会用程序员给出的这个缺省值初始化成员变量。

若成员变量是自定义类型:编译器自动生成的构造函数就会调用他的默认构造函数

程序员需要自己分析类型成员和初始化需求,绝大多数场景都需要程序员自己实现构造函数!

什么是默认构造函数?

编译器自动生成的构造函数只是 默认构造函数之一。无参数的构造函数全缺省的构造函数 也属于默认构造函数

总结:不需要传参 就可以调用的构造函数 ➡️默认构造函数,默认构造函数只能有一个

❓问题遗留:

class Time
{
public:// 没有默认构造函数Time(int hour){cout << "Time()" << endl;_hour = 0;_minute = 0;_second = 0;}
private:int _hour;int _minute;int _second;
};class Date
{
private:// 基本类型(内置类型)int _year;int _month;int _day;// 自定义类型Time _t;
}int main()
{Date d;return 0;
}

代码问题描述:
当前time类中 我们显示定义了构造函数 ,则编译器不会自动生成默认构造函数。Data类包含time类,time类没有默认构造函数,导致Data类编译器也无法为这个类自动生成默认构造函数。

报错如下:在这里插入图片描述
此时,我们只能显示实现构造函数,详见 下期知识点初始化列表

三、析构函数

干嘛的 ?

清理资源,类似于 Desdory .

语法定义

1、析构函数名实在类名前面加上~

2、无参数无返回值类型

3、一个类只能有一个析构函数。程序员没定义,编译器自动生成析构函数。析构函数不能重载。

4、对象声明周期结束的时候,编译器自动调用

因为在函数栈帧里,所以先定义的后析构后定义的先析构

代码示例:我们创建不同生命周期不同作用域的对象,注意观察他们的析构顺序

#include<iostream>
using namespace std;
class Date
{
public:Date(int year = 1){_year = year;}~Date(){cout << "~Date()->"<<_year<< endl;}private:// 基本类型(内置类型)int _year;int _month;int _day;
};
void func()
{Date d3(3);static Date d4(4);
}Date d5(5);
static Date d7(7);
Date d6(6);
static Date d8(8);// 局部对象(后定义先析构) -》 局部的静态 -》全局对象(后定义先析构)
int main()
{Date d1(1);Date d2(2);func();return 0;
}

析构顺序

局部对象(后定义先析构) ➡️ 局部的静态 ​ ➡️ 全局对象(无论静态or非静态 都是后定义先析构)

在这里插入图片描述

默认生成的析构函数跟构造函数类似,

如果要清理的资源是内置类型,则不做处理。若是自定义类型的成员,则编译器去调用它的析构函数

其他的默认成员函数我们会在下节介绍~

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

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

相关文章

Mac数据如何恢复?3 款最佳 Mac 恢复软件

如果您认为 Mac 上已删除的文件永远丢失了&#xff0c;那您就大错特错了&#xff01;实际上&#xff0c;即使您清空了 Mac 上的垃圾箱&#xff0c;也有许多解决方案可以帮助您恢复已删除的文件。最好的解决方案之一是 Mac 恢复删除软件。最好的Mac 恢复删除应用程序可以轻松准确…

反射机制详解

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a;Java从入门到精通 ✨特色专栏&#xff…

SM9加密算法:安全、高效的国产密码技术

随着信息技术的飞速发展&#xff0c;网络安全问题日益凸显。加密算法作为保障信息安全的核心技术&#xff0c;受到了广泛关注。在我国&#xff0c;一种名为SM9的加密算法逐渐崭露头角&#xff0c;凭借其卓越的安全性能和高效计算能力&#xff0c;成为了新一代国产密码技术的代表…

常用的Java日志框架:Log4j、SLF4J和Logback

日志是软件开发中不可或缺的一部分&#xff0c;它有助于记录应用程序的运行状态、调试问题和监控系统。Java中有多个流行的日志框架&#xff0c;如Log4j、SLF4J和Logback。 一、Log4j 1.1 什么是Log4j&#xff1f; Log4j是Apache基金会开发的一个开源日志框架&#xff0c;它…

Milvus跨集群数据迁移

将 Milvus 数据从 A 集群&#xff08;K8S集群&#xff09;迁到 B 集群&#xff08;K8S集群&#xff09;&#xff0c;解决方案很多&#xff0c;这里提供一个使用官方 milvus-backup 工具进行数据迁移的方案。 注意&#xff1a;此方案为非实时同步方案&#xff0c;但借助 MinIO 客…

C++基础std::bind

目录 说明 举例子&#xff1a; 说明 std::bind是一个函数模板&#xff0c;用于创建一个可调用对象&#xff0c;该对象可以在稍后的时候被调用。bind的作用是将函数与参数绑定在一起&#xff0c;在调用时可以自动传入预定的参数值。 std::bind的基本语法如下&#xff1a; templ…

1. zabbix监控服务器部署

zabbix监控服务器部署 一、监控的作用1、监控的方式2、zabbix监控获取数据的方式 二、zabbix server部署1、确保时间同步2、添加epel源3、添加zabbix仓库4、安装zabbix服务端软件5、在数据库创建zabbix需要的表、授权用户6、编辑zabbix server配置文件&#xff0c;指定数据库连…

在WordPress中使用AI的实用方法:入门级

随着人工智能&#xff08;AI&#xff09;的快速发展&#xff0c;WordPress平台上引入了越来越多的工具和插件&#xff0c;为网站管理员提供了强大的功能。这些工具不仅可以提升网站的用户体验&#xff0c;还能简化网站管理过程。本文将介绍几种在WordPress中使用AI的实用方法&a…

广州化工厂可燃气体报警器检定检验:安全生产新举措显成效

随着科技的不断发展&#xff0c;可燃气体报警器的检定检验技术也在不断进步。 广州的一些化工厂开始采用先进的智能检测系统和数据分析技术&#xff0c;对报警器的性能进行更加精准和全面的评估。 这些新技术不仅能够提高检定检验的效率和准确性&#xff0c;还能够为化工厂的…

大数据的力量:推动战略决策和业务转型

在当前全球化的时代背景下&#xff0c;国际间的联系日益紧密&#xff0c;世界变得更加互联互通。面对各种危机&#xff0c;数据驱动决策和分析显得愈发重要。从医学研究到市场趋势分析&#xff0c;大数据技术在各个领域发挥着关键作用&#xff0c;推动着一场深刻的变革浪潮。 大…

打开IE自动跳转EDGE的解决方法

目录 1. 创建快捷方式的解决方案 2. 其他可以尝试但未必靠谱的方法 2.1 通过设置EDGE浏览器实现 2.2 设置internet属性 2.3 BHO拓展管理 找到Windows10中的IE浏览器的方法&#xff1a; WIN Q&#xff0c;打开搜索栏&#xff1b;键入IE&#xff0c;即可看到IE浏览器 1. …

Java Stream流应用

Stream流的核心方法 Stream流的方法主要包含如图的几种 提供部分应用场景做个思考&#xff1a; (1)从员工集合中筛选出salary大于8000的员工&#xff0c;并放置到新的集合里。 (2)统计员工的最高薪资、平均薪资、薪资之和。 (3)将员工按薪资从高到低排序&#xff0c;同样薪资…

深度理解微信小程序技术架构:从前端到后台

在当今移动互联网的时代&#xff0c;微信小程序作为一种轻量级、便捷的应用形式&#xff0c;已经成为许多用户和开发者的首选。本文将深入探讨微信小程序的技术架构&#xff0c;从前端视角到后台支撑&#xff0c;为读者全面解析这一新兴应用形式的奥秘。 #### 一、微信小程序的…

opencv中凸包运算函数convexHull()的使用

操作系统&#xff1a;ubuntu22.04OpenCV版本&#xff1a;OpenCV4.9IDE:Visual Studio Code编程语言&#xff1a;C11 1.功能描述 该函数cv::convexHull用于寻找一组二维点集的凸包&#xff0c;采用的是Sklansky算法[242]&#xff0c;当前实现中具有O(N logN)的时间复杂度。 1…

2024: 有效使用OKR的10个技巧

2023年是许多前所未有的一年。从真正意义上讲&#xff0c;这一年让我们为不可预测的事情做好了准备&#xff0c;也为不确定的事情提供了训练。在我们身边发生了这么多事情&#xff0c;而下一步的行动却依然不甚明朗的情况下&#xff0c;领导者们更应该开始制定战略&#xff0c;…

Linux服务器挖矿病毒处理

文章目录 Linux服务器挖矿病毒处理1.中毒表现2.解决办法2.1 断网并修改root密码2.2 找出隐藏的挖矿进程2.3 关闭病毒启动服务2.4 杀掉挖矿进程 3. 防止黑客再次入侵3.1 查找异常IP3.2 封禁异常IP3.3 查看是否有陌生公钥 补充知识参考 Linux服务器挖矿病毒处理 情况说明&#x…

FuTalk设计周刊-Vol.033

&#x1f525;AI漫谈 热点捕手 1、Stable Video Diffusion —— Stable Diffusion 推出的 AI 生成视频模型 Stable Video Diffusion 也是开源的&#xff0c;可以免费下载部署。支持文本/图片生成视频&#xff0c;最高支持 576*1024 分辨率 25 帧。 链接https://huggingface.…

DV、OV通配符SSL证书有什么区别

通配符SSL证书是经常提及的一种SSL证书类型&#xff0c;也被称为泛域名SSL证书。通配符证书在SSL证书当中是比较特殊的&#xff0c;它具有保护主域名及其下一级所有子域名的功能&#xff0c;非常适合子域名多的域名网站&#xff0c;能够有效的节省成本&#xff0c;并降低证书管…

申办乙级资信证书,河南工程咨询单位流程详解

河南工程咨询单位申办乙级资信证书的流程详解如下&#xff1a; 一、前期准备阶段 研读政策文件&#xff1a; 研读《工程咨询行业管理办法》&#xff08;国家发展改革委2017年第9号令&#xff09;以及《国家发展改革委关于印发<工程咨询单位资信评价标准>的通知》&#x…

调建堆的时间复杂度的计算与topK问题

建堆复杂度的计算 向下调整建堆 第一层有2^0个节点&#xff0c;最坏向下调整h-1次&#xff0c;第二层有2^1个节点&#xff0c;最坏向下调整h-2次&#xff0c;以此类推&#xff0c;将每一层所有节点最坏情况需要调整的次数相加&#xff0c;就能得到一个式子&#xff1a; 最后到…