【C++】再探构造函数 - 初始化列表详解

news2024/11/15 13:00:06

📢博客主页:https://blog.csdn.net/2301_779549673
📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!
📢本文由 JohnKi 原创,首发于 CSDN🙉
📢未来很长,值得我们全力奔赴更美好的生活✨

在这里插入图片描述

在这里插入图片描述

文章目录

  • 📢前言
  • 🏳️‍🌈 构造函数特点回顾
  • 🏳️‍🌈 初始化列表
    • ❤️ 引用, const 成员和类类型对象
    • 💛避免默认初始化
  • 👥总结


📢前言

C++ 构造函数

在 C++ 中,构造函数是一种特殊的成员函数,用于在创建对象时进行初始化操作。

构造函数具有与类名相同的名称,没有返回值类型。它可以有参数,以便在创建对象时传递必要的初始值。

例如,对于一个 Student 类,可能有一个构造函数 Student(int age, string name) 来初始化学生的年龄和姓名。

构造函数的主要作用是确保对象在创建时处于有效和合理的初始状态。这有助于提高程序的可靠性和可读性。

它可以自动被调用,无需显式调用。通过合理设计构造函数,可以避免对象处于未定义或错误的初始状态,从而减少潜在的错误和异常。


🏳️‍🌈 构造函数特点回顾

在上篇博客中,笔者介绍了构造函数的几种基本用法及特点,这里简单总结概括一下

构造函数的特点:

  1. 函数名与类名相同。
  2. 无返回值。(返回值啥都不需要给,也不需要写void,不要纠结,C++规定如此
  3. 对象实例化时系统会自动调用对应的构造函数。
  4. 构造函数可以重载
  5. 如果类中没有显式定义构造函数,则C++编译器会自动生成一个无参的默认构造函数,一旦用户显式定义编译器将不再生成。
  6. 无参构造函数、全缺省构造函数、我们不写构造时编译器默认生成的构造函数,都叫做默认构造函数。但是这三个函数有且只有一个存在,不能同时存在。无参构造函数和全缺省构造函数虽然构成函数重载,但是调用时会存在歧义。要注意很多同学会认为默认构造函数是编译器默认生成那个叫默认构造,实际上无参构造函数、全缺省构造函数也是默认构造,总结一下就是不传实参就可以调用的构造就叫默认构造。
  7. 我们不写,编译器默认生成的构造,对内置类型成员变量的初始化没有要求,也就是说是是否初始化是不确定的,看编译器。对于自定义类型成员变量,要求调用这个成员变量的默认构造函数初始化。如果这个成员变量,没有默认构造函数,那么就会报错,我们要初始化这个成员变量,需要用初始化列表才能解决。

说明:C++把类型分成内置类型(基本类型)和自定义类型。内置类型就是语言提供的原生数据类型,如:int/char/double/指针等,自定义类型就是我们使用class/struct等关键字自己定义的类型。

#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
class Date
{
public:
	// 1.⽆参构造函数
	// 可以认为是默认构造
	Date()
	{
		_year = 1;
		_month = 1;
		_day = 1;
	}

	// 2.带参构造函数
	Date(int year, int month, int day)
	{
		_year = year;
		_month = month;
		_day = day;
	}

	// 3.全缺省构造函数
	// 可以认为是默认构造
	Date(int year = 1, int month = 1, int day = 1)
	{
		_year = year;
		_month = month;
		_day = day;
	}

	void Print()
	{
		cout << _year << "/" << _month << "/" << _day << endl;
	}

	int GetYear()
	{
		return _year;
	}
private:
	int _year;
	int _month;
	int _day;
};

🏳️‍🌈 初始化列表

C++ 构造函数的初始化列表

在 C++ 中,构造函数的初始化列表是在构造函数的参数列表之后、函数体开始之前,用于对类的数据成员进行初始化的部分。

它以冒号开头,后面依次列出需要初始化的数据成员及其初始值。例如:Student::Student(int age, string name) : age_(age), name_(name) {}

初始化列表的主要优势在于效率更高,尤其对于引用和 const 成员,必须通过初始化列表进行初始化。

而且对于类成员对象,使用初始化列表能避免二次初始化。例如,一个类中包含另一个类的对象作为成员,通过初始化列表能确保其正确初始化。初始化列表使得初始化过程更加清晰和直观,有助于提高代码的可读性和可维护性。

❤️ 引用, const 成员和类类型对象

每个成员变量在初始化列表中只能出现一次,语法理解上初始化列表可以认为是每个成员变量定义初始化的地方。

其中引用成员变量const成员变量没有默认构造的类类型变量,必须放在初始化列表位置进行初始化,否则会编译报错。

以下是举例说明

class Date
{
public:
	//初始化列表
	Date(int& xx, int year, int month, int day)
		:_year(year)
		, _month(month)
		, _day(day)

		//, _year(year)  无法实现,只能初始化一次

		, _n(1)//const成员只能在列表初始化时初始化

		, _ref(xx)//引用成员只能在列表初始化时初始化

		, _t(1)

		, _ptr((int*)malloc(12))
	{

		//引用成员变量,const成员变量,没有默认构造的类类型变量,必须放在初始化列表位置进行初始
		//化,否则会编译报错。
		// error C2512: “Time”: 没有合适的默认构造函数可⽤
		// error C2530 : “Date::_ref” : 必须初始化引⽤
		// error C2789 : “Date::_n” : 必须初始化常量限定类型的对象

		if (_ptr == nullptr)
		{
			perror("malloc fail");
		}
		else
			memset(_ptr, 0, 12);
	}

	void Print() const
	{
		cout << _year << "/" << _month << "/" << _day << endl;
	}

private:
	//声明

	//普通成员可初始化,可不初始化
	int _year;
	int _month;
	int _day;

	//特殊成员必须初始化
	const int _n;		//const成员只能在列表初始化时初始化

	int& _ref;		//引用成员只能在列表初始化时初始化

	Time _t;	//假如没有合适的默认构造函数,就必须传值

	int* _ptr;
};

注意: 初始化列表的成员初始化顺序是按照成员变量在类中的声明顺序,而不是初始化列表中的顺序。

💛避免默认初始化

对于没有默认构造函数的成员变量,必须在初始化列表中进行初始化。

比如说前面代码中刚出现的

C++11支持在成员变量声明的位置给缺省值,这个缺省值主要是给没有显示在初始化列表初始化的成员使用的。

尽量使用初始化列表初始化,因为那些你不在初始化列表初始化的成员也会走初始化列表,如果这个成员在声明位置给了缺省值,初始化列表会用这个缺省值初始化。如果你没有给缺省值,对于没有显示在初始化列表初始化的内置类型成员是否初始化取决于编译器,C++并没有规定。对于没有显示在初始化列表初始化的自定义类型成员会调用这个成员类型的默认构造函数,如果没有默认构造会编译错误。


👥总结


本篇博文对 初始化列表 做了一个较为详细的介绍,不知道对你有没有帮助呢

觉得博主写得还不错的三连支持下吧!会继续努力的~

请添加图片描述

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

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

相关文章

vue3 快速入门 (三) : vue中的图片路径

1. 本文环境 Vue版本 : 3.4.29Node.js版本 : v20.15.0系统 : Windows11 64位IDE : VsCode 2. 加载图片路径的方式 以下是VUE3中一些常见的引用图片路径的方法&#xff1a; 2.1 public文件夹的方式 2.1.1 public文件夹是什么 在 Vue3 中&#xff0c;public文件夹用于存放静…

绘制混淆矩阵热力图

Python绘制混淆矩阵热力图 用matplotlib绘制混淆矩阵&#xff0c;可以通过改变 imshow 函数中的 cmap 参数来修改颜色。cmap 参数接受一个 colormap 的名字&#xff0c;你可以选择许多不同的 colormap&#xff0c;例如 ‘viridis’, ‘plasma’, ‘inferno’, ‘magma’, ‘civ…

union的特性和大小端

一、union在c和c语言中的特性 1.共享内存空间&#xff1a;union的所有成员共享同一块内存空间。意味着在同一时刻&#xff0c;union 只能存储其成员 中的一个值。当你修改了union中的一个成员&#xff0c;那么其它成员的值也会被改变&#xff0c;因为它们实际上都是指向同一块…

Google Chrome 浏览器在链接上点右键的快捷键

如今&#xff0c;越来越多的软件都懒得设个快捷键&#xff0c;就算设置了连个下划线也懒得加了。 谷歌浏览器右键 > 链接另存为... 和 复制链接地址 的快捷键 (如图)

pycharm操作mysql数据库

1、创建测试数据库 use test;CREATE TABLE t_user ( id INT(11) NOT NULL AUTO_INCREMENT, userName VARCHAR(20) DEFAULT NULL, password VARCHAR(20) DEFAULT NULL, PRIMARY KEY (id)) ENGINEINNODB AUTO_INCREMENT2 DEFAULT CHARSETutf8;INSERT INTO t_user(id,userName,pas…

【HZHY-AI300G智能盒试用连载体验】在华为IoTDA平台上建立设备

目录 华为IoTDA平台 注册IoTDA实例 创建产品 添加设备 本文首发于&#xff1a;【HZHY-AI300G智能盒试用连载体验】 智能工业互联网网关 - 北京合众恒跃科技有限公司 - 电子技术论坛 - 广受欢迎的专业电子论坛! 在上一篇博文中介绍了如何在HZHY-AI300G智能盒创建南向设备&a…

【Linux 14】进程间通信概念

文章目录 &#x1f308; 一、进程间通信的目的&#x1f308; 二、进程间通信的理解&#x1f308; 三、进程间通信的分类 &#x1f308; 一、进程间通信的目的 数据传输&#xff1a;一个进程需要将它的数据发送给另一个进程资源共享&#xff1a;多个进程之间共享同样的资源。通…

过于复杂,复杂性越高,脆弱性也就越大。

现代计算架构的复杂性很容易让那些试图保护它们的网络安全从业者感到不知所措。 技术生产者和消费者必须做出彻底而根本的改变,以减轻当前和未来的网络威胁。 在过去 20 多年里,我们目睹了信息技术能力的爆炸式增长,渗透到了我们的个人和职业生活中。我们还看到,针对所有…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] LYA的马跳棋游戏(200分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 🍿 最新华为OD机试D卷目录,全、新、准,题目覆盖率达 95% 以上,支持题目在线…

VSCode切换默认终端

我的VSCode默认终端为PowerShell&#xff0c;每次新建都会自动打开PowerShell。但是我想让每次都变为cmd&#xff0c;也就是Command Prompt 更改默认终端的操作方法如下&#xff1a; 键盘调出命令面板&#xff08;CtrlShiftP&#xff09;中,输入Terminal: Select Default Prof…

VBA技术资料MF177:数据验证时单值及多值的分别处理

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套&#xff0c;分为初级、中级、高级三大部分&#xff0c;教程是对VBA的系统讲解&#…

Python遗传算法GA优化SVR支持向量回归、ANFIS自适应神经模糊推理系统预测证券指数ISE数据

全文链接&#xff1a;https://tecdat.cn/?p37060 本文旨在通过应用多种机器学习技术&#xff0c;对交易所的历史数据进行深入分析和预测。我们帮助客户使用了遗传算法GA优化的支持向量回归&#xff08;SVR&#xff09;、自适应神经模糊推理系统&#xff08;ANFIS&#xff09;…

全球价值链贸易核算matlab程序(TIVA与WWZ分解方法大全)以及区域表链接方法

数据来源&#xff1a;基础数据来源于世界银行、国家统计局时间范围&#xff1a;2007年数据范围&#xff1a;国家与行业层面样例数据&#xff1a; 包含内容&#xff1a; 全部数据下载链接&#xff1a;https://download.csdn.net/download/samLi0620/89567902

CAS乐观锁原理

1、什么是CAS&#xff1f; compare and swap也就是比较和交换&#xff0c;他是一条CPU的并发原语。 他在替换内存的某个位置的值时&#xff0c;首先查看内存中的值与预期值是否一致&#xff0c;如果一致&#xff0c;执行替换操作。 这个操作是一个原子性操作。 Java中基于Un…

学生选课表练习(面试题)

一、表结构&#xff1a; 学生表&#xff1a;Student&#xff08;编号sid&#xff0c;姓名sname&#xff0c;生日birthday&#xff0c;性别ssex&#xff0c;班级 classid) 课程表&#xff1a;Course&#xff08;课程编号cid&#xff0c;课程名称cname&#xff0c;教师编号tid&a…

《0基础》学习Python——第十九讲__爬虫/<2>

一、用get请求爬取一般网页 首先由上节课我们可以找到URL、请求方式、User-Agent以及content-type 即&#xff1a;在所在浏览器页面按下F12键&#xff0c;之后点击网路-刷新&#xff0c;找到第一条双击打开标头即可查看上述所有内容&#xff0c;将上述URL、User-Agent所对应的…

高考完的假期想学c语言 要注意那些问题?

在高考完的假期学习C语言是一个非常好的选择&#xff0c;可以为以后大学的专业学习打下坚实的基础。我收集制作一份C语言学习包&#xff0c;对于新手而言简直不要太棒&#xff0c;里面包括了新手各个时期的学习方向&#xff0c;包括了编程教学&#xff0c;数据处理&#xff0c;…

参考椭球体与坐标系|大地水准面|地理坐标系|投影坐标系|EPSG|SRID

相关概念之间的关系: 大地水准面 **大地水准面(Geoid)**是海洋表面在排除风力、潮汐等其他影响后&#xff0c;只考虑重力和地球自转影响下的形状&#xff0c;这个形状延伸过陆地生成的一个密闭的曲面。 简单来说&#xff1a;就是一个假想的由地球自由静止的海水平面&#xf…

最新matlab2024a安装教程

一、软件领取 领取方式&#xff1a; https://pan.baidu.com/s/1TeH5F7ilPQVeLc9S9eDmSQ?pwdqot6 二、安装步骤 1、右击下载好的安装包&#xff0c;选择解压缩。&#xff08;用电脑自带的解压功能或解压软件都可以&#xff0c;我这里用的电脑自带的&#xff09; 2、打开…

购物车案例(源码分享)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 非常期待和您一起在这个小…