c++类与对象之初始化列表

2024-09-04 15:20
文章标签 c++ 对象 初始化 列表

本文主要是介绍c++类与对象之初始化列表,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一.什么是初始化列表

1.再谈构造函数

在创建对象时,我们一般会在含参构造函数中赋值:

但实际上,这些值不是成员变量的初始值!!这种操作也不是成员变量的初始化!!!

那么对象的初始化在哪里呢?就在初始化列表

2.初始化列表

如下就是我们显式定义的初始化列表:

以冒号开头,每个成员之间以逗号分隔,每一个成员变量后面跟一个放在括号中的初始值或表达式

同时,在显式定义时,不是必须要将所有的成员都赋值,没有进行显式赋值的,编译器会自动处理

二.特性

1.初始化列表是每个成员定义的地方

什么是初始化?初始化就是在创建变量的同时给该变量一个初始值。而当进入构造函数体内部时,对象已经创建好了,说明对象中的成员变量就已经创建好了,那时候就不能叫做初始化了,而是对以已经创建的变量进行赋值

那哪里是成员声明的地方?如下:

2.初始化列表的执行顺序就是成员变量声明的顺序

如上,通过调试会发现,一定是先初始化month再初始化day,和列表中写的顺序无关

2.初始化列表在构造函数之前执行

执行完初始化列表,其实对象就创建出来了,此时构造函数内部就是简单的赋值操作

3.const成员,必须在定义时初始化

如果只有声明,就会编译不通过,所以要给他一个初始值。但要是放在构造函数的函数体内,由于能够走到构造函数体内,就说明对象已经定义了,那么成员变量就也已经定义了,那就不符合const变量要在定义时初始化这个要求了。所以要在初始化列表中进行初始化

所以如上,可以在初始化列表给定初始值

4.成员变量定义了引用,也要在定义时进行初始化

之前说过,引用必须初始化,所以可以在初始化列表中进行定义

5.默认初始化列表

编译器提供的默认初始化列表:对于内置类型是初始化为随机值;对于自定义类型则调用它的默认构造函数。

6.自定义类型的成员没有默认构造时

若没有默认构造只有一个有参构造,则必须在定义时进行初始化!!!

如图,没有默认构造时,必须在初始化列表进行初始化:

7.缺省值

如下:

在声明处给定的值其实是一个缺省值。进行初始化列表时,如果没有给参数,那就会使用缺省值

如上,最终结果是:2023-1-2   _a=2

但注意!!!!!!!!!!!!!!!自定义类型不能在声明时给出缺省值:

8.初始化列表可以和函数混合使用

但注意,month和day其实已经在初始化列表中定义过了。

能使用初始化列表就尽量使用。但是有些情况下不能只是用初始化列表,而是要和函数结合使用,比如stack的初始化:

这篇关于c++类与对象之初始化列表的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1136332

相关文章

Python如何计算两个不同类型列表的相似度

《Python如何计算两个不同类型列表的相似度》在编程中,经常需要比较两个列表的相似度,尤其是当这两个列表包含不同类型的元素时,下面小编就来讲讲如何使用Python计算两个不同类型列表的相似度吧... 目录摘要引言数字类型相似度欧几里得距离曼哈顿距离字符串类型相似度Levenshtein距离Jaccard相

c++中std::placeholders的使用方法

《c++中std::placeholders的使用方法》std::placeholders是C++标准库中的一个工具,用于在函数对象绑定时创建占位符,本文就来详细的介绍一下,具有一定的参考价值,感兴... 目录1. 基本概念2. 使用场景3. 示例示例 1:部分参数绑定示例 2:参数重排序4. 注意事项5.

使用C++将处理后的信号保存为PNG和TIFF格式

《使用C++将处理后的信号保存为PNG和TIFF格式》在信号处理领域,我们常常需要将处理结果以图像的形式保存下来,方便后续分析和展示,C++提供了多种库来处理图像数据,本文将介绍如何使用stb_ima... 目录1. PNG格式保存使用stb_imagephp_write库1.1 安装和包含库1.2 代码解

C++实现封装的顺序表的操作与实践

《C++实现封装的顺序表的操作与实践》在程序设计中,顺序表是一种常见的线性数据结构,通常用于存储具有固定顺序的元素,与链表不同,顺序表中的元素是连续存储的,因此访问速度较快,但插入和删除操作的效率可能... 目录一、顺序表的基本概念二、顺序表类的设计1. 顺序表类的成员变量2. 构造函数和析构函数三、顺序表

使用C++实现单链表的操作与实践

《使用C++实现单链表的操作与实践》在程序设计中,链表是一种常见的数据结构,特别是在动态数据管理、频繁插入和删除元素的场景中,链表相比于数组,具有更高的灵活性和高效性,尤其是在需要频繁修改数据结构的应... 目录一、单链表的基本概念二、单链表类的设计1. 节点的定义2. 链表的类定义三、单链表的操作实现四、

Redis存储的列表分页和检索的实现方法

《Redis存储的列表分页和检索的实现方法》在Redis中,列表(List)是一种有序的数据结构,通常用于存储一系列元素,由于列表是有序的,可以通过索引来访问元素,因此可以很方便地实现分页和检索功能,... 目录一、Redis 列表的基本操作二、分页实现三、检索实现3.1 方法 1:客户端过滤3.2 方法

使用C/C++调用libcurl调试消息的方式

《使用C/C++调用libcurl调试消息的方式》在使用C/C++调用libcurl进行HTTP请求时,有时我们需要查看请求的/应答消息的内容(包括请求头和请求体)以方便调试,libcurl提供了多种... 目录1. libcurl 调试工具简介2. 输出请求消息使用 CURLOPT_VERBOSE使用 C

C++实现获取本机MAC地址与IP地址

《C++实现获取本机MAC地址与IP地址》这篇文章主要为大家详细介绍了C++实现获取本机MAC地址与IP地址的两种方式,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 实际工作中,项目上常常需要获取本机的IP地址和MAC地址,在此使用两种方案获取1.MFC中获取IP和MAC地址获取

C/C++通过IP获取局域网网卡MAC地址

《C/C++通过IP获取局域网网卡MAC地址》这篇文章主要为大家详细介绍了C++如何通过Win32API函数SendARP从IP地址获取局域网内网卡的MAC地址,感兴趣的小伙伴可以跟随小编一起学习一下... C/C++通过IP获取局域网网卡MAC地址通过win32 SendARP获取MAC地址代码#i

JSON字符串转成java的Map对象详细步骤

《JSON字符串转成java的Map对象详细步骤》:本文主要介绍如何将JSON字符串转换为Java对象的步骤,包括定义Element类、使用Jackson库解析JSON和添加依赖,文中通过代码介绍... 目录步骤 1: 定义 Element 类步骤 2: 使用 Jackson 库解析 jsON步骤 3: 添