【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,一经查实,立即删除!

相关文章

java每日一题:static与final的区别

static和final在Java中都是用于修饰类、方法、变量等的修饰符&#xff0c;但它们各自有不同的作用和含义。以下是关于static与final修饰后的主要区别&#xff1a; 一、static修饰符 含义&#xff1a; static是静态修饰符&#xff0c;表示所修饰的成员&#xff08;变量、方法…

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…

第0讲:创建一个Vite工程

打开cmd窗口。 npm create vitelatest然后输入项目名&#xff0c;这里起名为gamelets&#xff08;很多小游戏的意思&#xff09; 接下来选择框架为&#xff1a; Vanilla &#xff08;表示不使用框架&#xff0c;原生JS&#xff09; 选择语言为&#xff1a;TypeScript 最后提…

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…

Ubuntu16-18网卡配置

Ubuntu16配置一网卡多ip地址 vi /etc/network/interfaces auto eno1iface eno1 inet staticaddress 100.100.100.100netmask 255.255.255.0gateway 100.100.100.254dns-nameservers 8.8.8.8auto eno1:0 iface eno1:0 inet staticaddress 103.193.172.186netmask 255.255.255.0…

1. zabbix监控服务器部署

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

Clickhouse DBA常用的sql语句

clickhouse系统表官方文档https://clickhouse.com/docs/en/operations/system-tables Clickhouse的语法有点像Mysql Clickhouse没有delete和update语句&#xff0c;使用alter来替代 https://clickhouse.com/docs/zh/sql-reference/statements/alter/delete ALTER TABLE [db.]…

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

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

emacs verilog-mode RTL集成

最近用了一下emacs,用于集成一下自己的子系统。只能说真香。记录一下使用规则和收藏几个比较好的网站。 主要参考这个网站即可。 emacs-verilog mode中文网站: https://www.wenhui.space/docs/02-emacs/verilog_mode_useguide/ 技巧 1.常用模板 下面模板基本上Verilog …

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

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

boost io 上一篇ppppppppppp

111111111111111111111111111111111111111111111111 RPC 既不是协议&#xff0c;也不是框架。只是一个概念&#xff0c;一种通信方式&#xff0c;底层有很多实现方式。 222222222222222222222222222222222222222222222222222222222 class async_listener { public: typedef b…

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

在当前全球化的时代背景下&#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…