C++入门学习——初始化列表

概念

初始化列表:以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟一个放在括 号中的初始值或表达式

class Date
{
public://初始化列表Date(int year,int month,int day):_year(year),_month(month),_day(day){}private://声明int _year = 1;//缺省值int _month = 1;int _day;const int _n;
};int main()
{//对象实例化Date d1(2024, 1, 31);return 0;
}

【注意】

1. 每个成员变量在初始化列表中只能出现一次(初始化只能初始化一次)

class Date
{
public:Date(int year, int month, int day):_year(year), _month(month), _day(day), _n (2),_year(3){}private://声明int _year = 1;//缺省值int _month = 1;int _day;const int _n;
};int main()
{//对象实例化Date d1(2024, 1, 31);return 0;
}

初始化列表能只能初始化一次,多次初始化会报错如下:
在这里插入图片描述

2. 类中包含以下成员,必须放在初始化列表位置进行初始化:

  • 引用成员变量
class A
{
public:A(int a ):_a(a){cout << "A(int a=0)" << endl;}private:int _a;
};class Date
{
public://初始化列表是每个成员变量定义初始化的位置Date(int year, int month, int day),_month(2),ref(year){//赋值修改_year = year;_month = month;_day = day;//ref=year;//引用成员变量不能在函数体内初始化}private://声明int _year = 1;//缺省值int _month = 1;int _day;int& ref;
};int main()
{//对象实例化Date d1(2024, 1, 31);return 0;
}
  • const成员变量
class Date
{
public://初始化列表是每个成员变量定义初始化的位置Date(int year, int month, int day):_n(1)//const成员变量必须使用初始化列表进行初始化,_month(2){//赋值修改_year = year;_month = month;_day = day;//_n = 2;//const成员变量不能在函数体内初始化}private://声明int _year;int _month;int _day;const int _n;
};int main()
{//对象实例化Date d1(2024, 1, 31);return 0;
}
  • 没有默认构造函数的自定义类型成员变量
class Date
{
public://初始化列表是每个成员变量定义初始化的位置Date(int year, int month, int day),_month(2),_a(20)//没有默认构造函数的自定义类型成员变量必须在初始化列表进行初始化{//赋值修改_year = year;_month = month;_day = day;}private://声明int _year = 1;//缺省值int _month = 1;int _day;const int& ref;A _a;const int _n;
};int main()
{//对象实例化Date d1(2024, 1, 31);return 0;
}

const成员变量、引用成员变量、没有默认构造函数的自定义类型成员变量必须在初始化列表内初始化的原因:

①初始化列表是对象的成员变量定义的地方。

②对象的内置类型成员变量在初始化列表定义时没有要求必须初始化,因此既可以在初始化列表进行初始化,也可以在构造函数体内初始化。

③而const成员变量、引用成员变量、没有默认构造函数的自定义类型成员变量不能先定义再初始化,它们在初始化列表内定义,并且必须在定义时就初始化,因此必须在初始化列表内初始化。

3. 尽量使用初始化列表初始化,因为不管你是否使用初始化列表,对于自定义类型成员变量,一定会先使用初始化列表初始化。

为什么会先使用初始化列表初始化?

因为自定义类型成员需要调用构造函数进行初始化,这个构造函数只能在初始化列表中调用,即使不写出来,编译器也会添加到初始化列表进行初始化

4. 成员变量在类中声明次序就是其在初始化列表中的初始化顺序,与其在初始化列表中的先后次序无关

观察下面代码,会是哪个结果:

A. 输出1 1

B.程序崩溃

C.编译不通过

D.输出1 随机值

class A
{
public:A(int a):_a1(a),_a2(_a1){}void Print() {cout << _a1 << " " << _a2 << endl;}//private:int _a2;int _a1;
};int main()
{A aa(1);aa.Print();return 0;
}

上面代码,类成员变量中先声明了_a2,再声明了_a1,因此初始化的顺序是先初始化_a2,再初始化_a1。先声明_a2就会先初始化_a2,用_a1初始化_a2,由于此时_a1还是随机值,因此_a2的值也是随机值,_a1使用a的值1进行初始化,因此,_a1的值为1。

image-20240713212721704

所以,建议类中的成员变量声明的顺序和初始化列表中初始化的顺序一致。

初始化列表其他注意点

class A
{
public:A(int a = 0, int b = 0):_a(a){cout << "A(int a=0)" << endl;}private:int _a;
};class Date
{
public://初始化列表是每个成员变量定义初始化的位置Date(int year, int month, int day):_n(1)//const成员变量必须使用初始化列表进行初始化, _month(2), ref(2), _a(20, 10)//没有默认构造函数的自定义类型成员变量必须在初始化列表进行初始化, _p((int*)malloc(sizeof(4)*10))//初始化列表不能写多条语句{//赋值修改_year = year;_month = month;_day = day;//_n = 2;//const成员变量不能在函数体内初始化if (_p == nullptr){perror("malloc fail");}}private://声明//缺省值是给初始化列表用的int _year = 1;//缺省值int _month = 1;int _day;const int& ref;A _a;const int _n;int *_p;
};int main()
{//对象实例化Date d1(2024, 1, 31);A a(5, 5);return 0;
}

①初始化列表是每个成员变量定义初始化的位置

②缺省值是给初始化列表用的

③初始化列表不能写多条语句

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

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

相关文章

[Windows] 油.管视频下载神器 Gihosoft TubeGet Pro v9.3.88

描述 对于经常在互联网上进行操作的学生&#xff0c;白领等&#xff01; 一款好用的软件总是能得心应手&#xff0c;事半功倍。 今天给大家带了一款高科技软件 管视频下载神器 无需额外付费&#xff0c;永久免费&#xff01; 亲测可运行&#xff01;&#xff01; 内容 目前主…

高德地图显示圆形区域并在区域边上标注半径

bug&#xff1a;循环创建三个圆形区域 &#xff0c;数组设置为[{raduis:500,color:“#FF0000”}]&#xff0c;然后循环取颜色会莫名其妙报错修改为 strokeColor: [“#FF0000”, “#1EE3C2”, “#3772E9”][i]即可 initAMap() {AMapLoader.load({key: "130cca3be68a2ff0fd5…

Eureka服务发现深度配置:实例ID与租约续期策略

Eureka服务发现深度配置&#xff1a;实例ID与租约续期策略 在微服务架构中&#xff0c;服务注册与发现是保证服务间相互发现和通信的基础。Netflix Eureka作为广泛使用的服务注册中心&#xff0c;提供了丰富的配置选项来满足不同场景下的需求。其中&#xff0c;服务实例ID和租…

Apache访问机制配置

Apache访问机制配置 Apache HTTP Server&#xff08;简称Apache&#xff09;是世界上使用最广泛的Web服务器之一。它的配置文件通常位于/etc/httpd/conf/httpd.conf或/etc/apache2/apache2.conf&#xff0c;根据操作系统的不同而有所不同。以下是配置Apache访问机制的详细说明…

记VMware网络适配器里的自定义特定虚拟网络一直加载问题解决办法

1、问题描述 VMware网络适配器里的自定义特定虚拟网络一直加载问题&#xff1a; 在自定义&#xff1a;特定虚拟网络选择的时候 没有上图所示的三个选择&#xff0c;而是正在加载虚拟网络.... 如下图所示&#xff1a; 2、解决办法 2.1、原因分析&#xff1a; 是安装时候出现…

2024年睿抗题解(1-3)以及赛后总结

目录 总结&#xff1a; 题1&#xff1a;RC-u1 热҈热҈热҈ 分数 10 题目&#xff1a; 解题思路&#xff1a; 完整代码&#xff1a; 题2&#xff1a;RC-u2 谁进线下了&#xff1f; 分数 15 题目&#xff1a; 解题思路&#xff1a; 完整代码&#xff1a; 题3&…

安防视频监控/视频汇聚EasyCVR平台浏览器http可以播放,https不能播放,如何解决?

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台基于云边端一体化架构&#xff0c;兼容性强、支持多协议接入&#xff0c;包括国标GB/T 28181协议、部标JT808、GA/T 1400协议、RTMP、RTSP/Onvif协议、海康Ehome、海康SDK、大华SDK、华为SDK、宇视SDK、乐橙SDK、萤石云SD…

如何防御sql注入攻击

当网站使用不安全的SQL查询方式时&#xff0c;黑客可以通过注入恶意SQL语句来获取网站的敏感信息或者控制网站的数据库。为了防止SQL注入攻击&#xff0c;以下是一些防御措施&#xff1a; 使用参数化查询 参数化查询是一种可以防止SQL注入攻击的有效方法。通过使用参数化查询…

7.15洛谷蓝题

二分答案的两个模板&#xff1a; 1.最小值的最大化&#xff1a; #define _CRT_SECURE_NO_WARNINGS 1 #include<bits/stdc.h> #include<iostream> #include<algorithm> #include<cstring> #include<vector> #include<queue> #include<…

Linux笔记之time命令测量命令的执行时间

Linux笔记之time命令测量命令的执行时间 在Linux中&#xff0c;time命令用于测量命令的执行时间。这对于分析和优化脚本或程序的性能非常有用。time命令会显示三个主要时间指标&#xff1a; real: 从命令开始到结束的实际时间&#xff08;也称为挂钟时间&#xff09;。user: …

Studying-代码随想录训练营day40| 198.打家劫舍、213.打家劫舍II、337.打家劫舍III

第40天&#xff0c;动态规划part07&#xff0c;动态规划经典题型“打家劫舍”(ง •_•)ง&#xff0c;编程语言&#xff1a;C 目录 198.打家劫舍 213.打家劫舍II 337.打家劫舍III 总结 198.打家劫舍 文档讲解&#xff1a;代码随想录打家劫舍 视频讲解&#xff1a;手…

【C++进阶学习】第七弹——AVL树——树形结构存储数据的经典模块

二叉搜索树&#xff1a;【C进阶学习】第五弹——二叉搜索树——二叉树进阶及set和map的铺垫-CSDN博客 目录 一、AVL树的概念 二、AVL树的原理与实现 AVL树的节点 AVL树的插入 AVL树的旋转 AVL树的打印 AVL树的检查 三、实现AVL树的完整代码 四、总结 前言&#xff1a…

JavaScript青少年简明教程:输入输出

JavaScript青少年简明教程&#xff1a;输入输出 JavaScript的输入输出情况相对复杂&#xff0c;因为它依赖于其运行的宿主环境&#xff08;如Web浏览器或Node.js&#xff09;来提供具体的输入输出机制。JavaScript的核心规范&#xff08;ECMAScript&#xff09;本身并不直接提…

C基础day9

一、思维导图 二、课后练习 1> 使用递归实现 求 n 的 k 次方 #include<myhead.h>int Pow(int n,int k) {if(k 0 ) //递归出口{return 1;}else{return n*Pow(n,k-1); //递归主体} }int main(int argc, const char *argv[]) {int n0,k0;printf("请输入n和k:&…

韩国coupang上线的卖家官网是什么?韩国电商有哪些平台?

根据Statista的调查报告&#xff0c;预计2024年电子商务市场收入将达到4.117亿美元。而韩国的电子商务市场是全球最具活力和创新性的市场之一&#xff0c;有数据显示2023年韩国电商市场规模已突破1700亿美元&#xff0c;全球排名第四。 韩国coupang上线的卖家官网是什么&#x…

c-sum=0(abc362)

题意&#xff1a;给一个数字n&#xff0c;还有一些区间&#xff0c;在区间内选取一个数字&#xff0c;使得所有数字相加等于0. 分析&#xff1a;先令所有数字为右区间&#xff0c;如果&#xff08;最大的数字&#xff09;小于0&#xff0c;那么永远都不可能变成0&#xff0c;如…

Linux虚拟机扩展磁盘空间

文章目录 在VM上进行扩展新的磁盘空间进入虚拟机将扩展的磁盘空间分配给对应的分区 VM 下的Linux虚拟机提示磁盘空间不足&#xff0c;需要对其进行磁盘扩容&#xff0c;主要有以下两步&#xff1a; 在VM上进行扩展新的磁盘空间 先关闭虚拟机在VM的虚拟机设置处进行硬盘扩展 …

Redislnsight-v2远程连接redis

redis安装内容添加&#xff1a; Linux 下使用Docker安装redis-CSDN博客 点击添加 添加ip地址&#xff0c;密码&#xff0c;端口号 创建完成 点击查看内容&#xff1a;

Redis的单线程讲解与指令学习

目录 一.Redis的命令 二.数据类型 三.Redis的key的过期策略如何实现&#xff1f; 四.Redis为什么是单线程的 五.String有关的命令 Redis的学习专栏&#xff1a;http://t.csdnimg.cn/a8cvV 一.Redis的命令 两个基本命令 在Redis当中&#xff0c;有两个基本命令&#xff1…

记录些MySQL题集(3)

MySQL 分区技术深入解析 分区的基本概念 MySQL分区 是一种数据库优化的技术&#xff0c;它允许将一个大的表、索引或其子集分割成多个较小的、更易于管理的片段&#xff0c;这些片段称为“分区”。每个分区都可以独立于其他分区进行存储、备份、索引和其他操作。这种技术主要…