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

news2024/11/18 14:55:19

全文目录

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

引言

上一篇文章中介绍了构造函数,它可以在实例化一个类对象的时候自动调用,以初始化类对象:
戳我看默认成员函数详解
但是,不难发现,在构造函数体中对成员变量的初始化其实是属于对它们进行赋值操作而不是定义。那么对于一些只能在定义时给值的变量,它们在定义之后就不能改变(例如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.coloradmin.cn/o/569933.html

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

相关文章

武汉环保门禁电子台账视频监控系统

武汉环保门禁电子台账视频监控系统,是顺应国家政策需求,基于视频监控、环保门禁系统、物联技术,结合大数据和人工智能等技术手段,对汽车排放单位进行环境管理的一套综合系统。 系统介绍 该系统实现对机动车排放检测的监管&#…

Android 读取本地数据进行本地开发

前言 在日常开发当中,API接口还没有部署,但是UI已经出来了,这时候往往都会使用本地数据进行功能界面的搭建,这样往往能很大程度节约开发时间,工具类拿来直接用,话不多说,开整 一、项目搭建 1…

Web应用技术(第十四周/持续更新)

本次练习基于how2j和课本,初步认识Spring。 以后我每周只写一篇Web的博客,所以的作业内容会在这篇博客中持续更新。。。 一、Spring基础1.Spring概述:2.Sring组成:3.BeanFactory:4.控制反转:5.依赖注入:6.JavaBean与S…

学习Java可以从事什么岗位(合集)

学习Java可以从事什么岗位 学习Java可以从事的岗位 Java可以做网站 Java可以用来编写网站,现在很多大型网站都用Jsp写的,JSP全名Java Server Pages 它是一种动态网页技术,比如我们熟悉的163,一些政府网站都是采用JSP编写的。 所以…

MySQL小练习(使用JDBC操作数据库)

题目: 1.创建一个数据库(学号姓名缩写,如: 2020001zs)在数据库中创建一张表 (五个以上字段) ; 2.使用JDBC(使用PreparedStatement接口) 操作数据库对表中的数据进行增删改查操作 目录 一、数据库 1.创建数据库 2.创建表 3.添加数据 二、JDBC 1.准备环境 2.查询…

TCO-PEG-Thiol,反式环辛烯聚乙二醇巯基,具有末端硫醇基团的双功能TCO PEG衍生物

产品描述: TCO PEG Thiol是具有末端硫醇基团的双功能TCO PEG衍生物。TCO(反式环辛烯)基团与四嗪基团快速有效地反应,而硫醇(巯基)可用于与马来酰亚胺反应,与金表面结合并参与许多其他反应。 TC…

DOTA PSMA,1702967-37-0,PSMA-617,特异性膜抗原 (PSMA) 的强有效抑制剂

产品描述: DOTA-PSMA是Prostate特异性膜抗原 (PSMA) 的强有效抑制剂,其 Ki 值为 0.37 nM。DOTA-PSMA由三种成分组成:药效基团Glutamate-urea-Lysine,螯合剂DOTA(能够结合68Ga或177Lu),以及连接这两个实体的…

sftp配置免密以及权限配置

场景:机器A通过sftp免密登录机器B 机器A有用户redis、 nginx, 机器B有用户monitor、 bak用户 需求:机器A在nginx用户环境下,sftp机器B的bak目录 注意:因为sshd为了安全,对属主的目录和文件权限有所要求。如果权限…

[LitCTF 2023]ssvvgg(Steghide爆破)

题目是一张.svg的图片 关于SVG的简介: SVG格式文件是可缩放矢量图形文件的缩写,是一种标准的图形文件类型,用于在互联网上渲染二维图像。与其他流行的图像文件格式不同,SVG格式文件将图像存储为矢量,这是一种基于数学…

SpringCloud(27):授权控制实现

很多时候,我们需要根据调用来源来判断该次请求是否允许放行,这时候可以使用 Sentinel 的来源访问控制(黑白名单控制)的功能。来源访问控制根据资源的请求来源(origin)判断资源访问是否通过,若配…

运营-18.积分体系概念

积分体系是一种通过平台补贴来提升用户忠诚度、为平台各项业务的导流的运营手段; 作用 1. 积分体系可以引导用户逐渐投入沉没成本,包括时间、精力和金钱; 2. 沉没成本越高,用户越难以离开; 3. 积分体系可以给其他业务导…

数据库实训心得体会_数据库实习个人总结

数据库实训心得体会篇一一个月的数据库实训就转眼间就上完了,期间讲解了一个学生管理系统,最后还做了一个小的数据库链接作业。现在就说说关于vb链接的数据库的一些方法。 首先说数据库,简单的说就是建表格,然后把一张一张的表格和在一起,成为…

nginx判断访问的是不是index.html如果是且index.html存在直接返回

可以通过以下配置实现此功能: 复制server {listen 80;server_name example.com;root /var/www/example.com;index index.html;location / {try_files $uri $uri/ index;}location index {if (-f $document_root/index.html) {return 200;}rewrite ^ /index.html la…

Spring源码(一) — 序言

序言 Java程序员的日常开发一定都离不开Spring的框架,从Spring、SpringMVC、SpringBoot、SpringCloud… 而Spring框架就是Spring家族中最基础也是最重要的一个框架。 Spring 我们常说的Spring往往都绕不开IOC(控制反转)和AOP(切…

Zebec生态进展迅速,频被BitFlow、Matryx DAO等蹭热度碰瓷

进入到 2023 年以来, Zebec 生态的整体发展突飞猛进,除了流支付协议 Zebec Protocol 不断通过收购来扩大自身流支付业务、与万事达等合作推出 Zebec Card 等在支付业务上,实现进展外,其社区驱动的Layer3 模块化链 Nautilus Chain …

GP-NFC-Management of Multiple Secure Elements

GP_Mobile Task Force Requirements for NFC Mobile Management of Multiple Secure_Elements_v1.0.pdf 一、简介 在不久的将来,NFC 非接触式手机有望变得无处不在。 它们将用作支付卡、交通票、忠诚卡、访问控制徽章和许多其他非接触式服务卡。 一些试点已经在全…

CNN详细学习

前馈神经网络 常见激活函数 sigmoid函数 梯度消失与爆炸 通用逼近定理 根据通用近似定理,对于具有线性输出层和至少一个使用“挤压”性质的激活函数的隐藏层组成的前馈神经网络 只要其隐藏层神经元的数量足够,它可以以任意的精度来近似任何从一个定义…

java矢量切片实现

概述 可通过多种方式实现矢量切片的制作&#xff0c;前面讲到了基于postgis数据库、tippecanoe、Qgis等方式&#xff0c;本文讲述基于spring Boot框架下java的实现。 实现效果 实现代码 后端代码 引入依赖 <dependency><artifactId>giscat-vector-mvt</art…

Microsoft Office 2021安装

哈喽&#xff0c;大家好。今天一起学习的是office2021的安装&#xff0c;有兴趣的小伙伴也可以来一起试试手。 一、测试演示参数 演示操作系统&#xff1a;Windows 11 支持Win10安装&#xff0c;不支持Win7、XP系统 系统类型&#xff1a;64位 演示版本&#xff1a;cn_office_…

公有云弊端尽显,“云回迁”真的来了吗?

5到10年前&#xff0c;如果一家企业制定数字化转型战略&#xff0c;那么这项战略的核心大概率是将业务迁移上云。 现在&#xff0c;多数企业的业务已在云中“开花结果”&#xff0c;与以往不同的是&#xff0c;原先的一“朵”云变成了一“片”云。 没错&#xff0c;多云战略正…