类和对象【3】初始化列表

news/2024/10/17 18:12:49/

全文目录

  • 引言
  • 初始化列表
    • 定义
    • 特性
  • 总结

引言

上一篇文章中介绍了构造函数,它可以在实例化一个类对象的时候自动调用,以初始化类对象:
戳我看默认成员函数详解
但是,不难发现,在构造函数体中对成员变量的初始化其实是属于对它们进行赋值操作而不是定义。那么对于一些只能在定义时给值的变量,它们在定义之后就不能改变(例如const变量与引用变量)或者一些没有默认构造函数的类类型成员变量,构造函数中无法对它们进行定义。用构造函数显然就不能满足我们的需求。

那么在类对象实例化时,这些成员变量是在哪里定义的呢?定义时又是怎么对他们进行初始化的呢?
成员变量在初始化列表中定义并初始化

初始化列表

一般成员变量可以多次赋值,在构造函数体中进行赋值当然是可以的。但是构造函数体中只能实现赋值而不能定义成员变量,所以const成员变量、引用成员变量、无默认构造函数的类成员,就不能实现定义。而这些成员变量就必须在初始化列表中显式的定义并初始化:

class A
{
public:A(int a){_a = a;}
private:int _a;
};class B
{
public:/* B(int b){_b = b; _c = b;  } *///错误代码: 表达式不能是常量,A不能没有默认构造函数
private:int& _b;       //引用成员变量const int _c;  //const成员变量A _obj;        //没有默认构造函数的成员类
};

在这里插入图片描述

定义

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

类名(参数列表): 成员变量(初始值), 成员变量(初始值), ...
{}

初始化列表是成员变量定义的地方,我们就可以在初始化列表对以上三种成员变量进行定义并初始化:

class A
{
public:A(int a){_a = a;}
private:int _a;
};class B
{
public:B(int b): _b(b), _c(b), _obj(b) //在初始化列表调用其构造函数{}
private:int& _b;const int _c;A _obj;
};

特性

  1. 每个成员变量在初始化列表中只能出现一次(初始化只能初始化一次);
  2. 引用成员变量、const成员变量、无默认成员函数的成员类必须放在初始化列表位置进行初始化
  3. 对于自定义类型成员变量,都会先使用初始化列表进行定义并初始化(在成员变量声明是给的默认值就是在初始化列表中使用的);
  4. 成员变量在类中声明次序就是其在初始化列表中的初始化顺序,与其在初始化列表中的先后次序无关(所以建议将声明的次序与在初始化列表中的先后顺序写一致):
class A
{
public:A(int a): _a1(a), _a2(a1) //错误代码:未定义标识符a1{}private:int _a2;int _a1;
};

总结

到此,关于初始化列表的内容就介绍完了
在以后的编程中,建议成员变量都在初始化列表中进行初始化。当然也存在一些需要在构造函数内赋值的情况,例如需要动态开辟空间时,初始化列表显然不适合。

如果大家认为我对某一部分没有介绍清楚或者某一部分出了问题,欢迎大家在评论区提出

如果本文对你有帮助,希望一键三连哦

希望与大家共同进步哦


http://www.ppmy.cn/news/86644.html

相关文章

Toolformer and Tool Learning(LLMs如何使用工具)

大模型的能力让学术和工业界都对通用人工智能的未来充满幻想,在前一篇博文中已经粗略介绍, Augmented Language Models(增强语言模型) ALM的两大思路是推理和工具,本篇博文整理两篇关于Toolformer或Tool Learning的论…

【CH32】| 02——常用外设 | GPIO

系列文章目录 【CH32】| 00——开发环境搭建 【CH32】| 01——新建工程 | 下载 | 运行 |调试 【CH32】| 02——常用外设 | GPIO 失败了也挺可爱,成功了就超帅。 文章目录 前言1. GPIO简介2. IO口的内部结构框图保护二极管上下拉电阻施密特触发器两个MOS管输出寄存器…

STM8 使用74HC164外扩IO

背景 在嵌入式开发过程中,经常使用时、甚至设计时候,考虑成本等因素,需要外扩IO。这里就是使用STM8S003F3P6,这个芯片比较常用的,这个芯片封装很小,只有20个管脚的MCU,实际产品上用的非常多。 …

网络安全合规-数据分类分级具体操作

数据的安全防护,前提在于数据的分级分类。不同类别,不同安全等级的数据,防护手段和要求也是不尽相同的。 数据分类分级整体工作内容: 基础数据资产盘点 通过业务调研及技术探测,对企业的数据库进行全面扫描&#xff0c…

AF594 NHS,Alexa Fluor594 NHS Ester,AF 594 NHS 活化酯,用于成像和流式细胞术中的稳定信号生成

【产品描述】 陕西新研博美生物科技有限公司供应的​Alexa Fluor594是一种鲜红色染料。Alexa Fluor用于成像和流式细胞术中的稳定信号生成 594染料是水溶性的,并且从pH 4到pH 10对pH不敏感。Alexa Fluor 594染料与多种抗体、肽、蛋白质、示踪剂和扩增底物偶联&#…

pyside6中QcommandLinkButton 控件qss有哪些用法和案例

QCommandLinkButton 是 Qt GUI 框架中的一个功能按钮类,而 Qt Style Sheets (QSS) 提供了一种强大的方式来自定义 Qt 控件的外观。以下是 QCommandLinkButton 常用的 QSS 用法: 设置按钮样式:使用 background-color、border、color 等属性来设…

七、jdbcTemplate

一、JdbcTemplate(概念和准备) 1.什么是JdbcTemplate Spring框架对JDBC进行封装&#xff0c;使用JdbcTemplate方便对数据库操作 2.准备工作 引入相关的jar包 在spring配置文件配置数据库连接池 <!--数据库连接池--> <bean id"dataSource" class"c…

如何使用DOM操作HTML元素

欢迎来到DOM操作的狂欢&#xff01;你想改变HTML元素的样式或者移动它们&#xff1f;没问题&#xff0c;DOM操作可以轻松实现这些&#xff01; 首先&#xff0c;我们来谈谈什么是DOM。DOM就像一棵树&#xff0c;它的每个节点代表HTML文档中的一个元素。你想要修改或者操作这些元…