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

news2024/9/26 3:24:19

前言:C++中,初始化列表是构造函数中极为重要的一部分,是每个成员变量定义的地方。

目录

  • 一.什么是初始化列表
  • 二.何时用初始化列表
    • 声明处赋值——缺省值
  • 三.注意点

一.什么是初始化列表

初始化列表是每个成员变量定义的地方。不管我们有没有写,成员变量都要走一遍初始化列表。
初始化列表:以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个“成员变量”后面跟一个放在括号中的初始值或表达式。

#include<iostream>
using namespace std;
class A {
public:
	A()  //构造函数中的初始化列表
		:_a(10)
		,_b(20)
	{
		cout << "A()" << endl; 
	}
	void print()
	{
		cout << "_a = " << _a << endl;
		cout << "_b = " << _b << endl;

	}
private:
	int _a; // 注意,这里仅为声明,不是定义的地方。
	int _b;
};
int main()
{
	A a;
	a.print();
	return 0;
}

控制台输出如下:
在这里插入图片描述
由上图可以看出,实例化对象a调用了构造函数,初始化列表中的值也赋给了对应的成员变量。

但是这样的话并没有看出初始化列表的价值呀,因为我完全可以在构造函数中写成赋值形式,比如下面这样:输出结果是一样的。

A()  //构造函数
{
	_a = 10;
	_b = 20;
	cout << "A()" << endl; 
}

二.何时用初始化列表

类中出现以下成员,必须放在初始化列表位置(定义时)进行初始化:
1.const成员变量
2.引用成员变量
3.自定义类型成员变量(且没有可用默认构造函数)

以const成员变量举例:
在这里插入图片描述

前面说过,初始化列表是成员变量定义的地方,而const赋值必须在定义的地方初始化,因此给const变量赋值可以借助初始化列表:

#include<iostream>
using namespace std;
class A {
public:
	A()
		:_b(20)  //初始化列表初始化_b
		,_a(10)
	{
		cout << "A()" << endl; 
	}
	void print()
	{
		cout << "_a = " << _a << endl;
		cout << "_b = " << _b << endl;

	}
private:
	int _a;
	const int _b;   //const成员变量
};
int main()
{
	A a;
	a.print();
	return 0;
}

声明处赋值——缺省值

有时可能遇到在声明处赋值的情况:必须知道,这里的是声明,不是定义,定义是在初始化列表完成的。这里给的实际上是缺省值,就像缺省参数一样:
如果初始化列表显示给值了,则用初始化列表的值。
如果初始化列表没有显示给值,则用缺省值。

#include<iostream>
using namespace std;
class A {
public:
	A()
		:_a(100)  // 显示给值
	{
		cout << "A()" << endl; 
	}
	void print()
	{
		cout << "_a = " << _a << endl;
		cout << "_b = " << _b << endl;

	}
private:
    //必须知道,这里的是声明,不是定义。
	int _a = 10; //这里给的实际上是缺省值,就像缺省参数一样。
	const int _b = 20;  //const成员变量
};
int main()
{
	A a;
	a.print();
	return 0;
}

控制台输出如下:_a显示给值,输出100,_b没有,输出的是缺省值20
在这里插入图片描述

三.注意点

1.每个成员变量在初始化列表中只能出现一次(初始化只能初始化一次)
2.初始化列表是按照成员变量声明的顺序初始化的。
3.再次强调,类中出现以下成员,必须放在初始化列表位置(定义时)进行初始化:
const成员变量,引用成员变量,自定义类型成员变量(且没有可用默认构造函数)

文末BB:对哪里有问题的朋友,尽管在评论区留言,若哪里写的有问题,也欢迎朋友们在评论区指出,博主看到后会第一时间确定修改。最后,制作不易,如果对朋友们有帮助的话,希望能给博主点点赞和关注.
在这里插入图片描述

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

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

相关文章

带你了解—使用内网穿透,公网远程访问本地硬盘文件

文章目录 前言1. 下载cpolar和Everything软件3. 设定http服务器端口4. 进入cpolar的设置5. 生成公网连到本地内网穿透数据隧道 总结 前言 随着云概念的流行&#xff0c;不少企业采用云存储技术来保存办公文件&#xff0c;同时&#xff0c;很多个人用户也感受到云存储带来的便利…

测试右移,也就是生产环境下的QA

一、一个生产环境 Bug 的解决办法 先来跟大家分享一个生产环境下的 Bug&#xff1a; 一个在线订购葡萄酒的系统&#xff0c;订购流程相对复杂&#xff0c;下单过程中后台会有随机的失败&#xff0c;系统采取的措施是重试&#xff0c;就是说顾客下单后&#xff0c;后台如果有错…

中期国际:MT4数据挖掘与分析方法:以数据为导向,制定有效的交易策略

在金融市场中&#xff0c;制定有效的交易策略是成功交易的关键。而要制定一份可靠的交易策略&#xff0c;数据挖掘与分析方法是不可或缺的工具。本文将介绍如何以数据为导向&#xff0c;利用MT4进行数据挖掘与分析&#xff0c;从而制定有效的交易策略。 首先&#xff0c;我们需…

易服客工作室:Uncode主题 - 创意和WooCommerce WordPress主题

Uncode主题是一款像素完美的创意 WordPress 主题&#xff0c;适用于任何类型的网站&#xff08;作品集、代理机构、自由职业者、博客&#xff09;&#xff0c;也是适用于商店&#xff08;电子商务、在线商店、企业&#xff09;的顶级 WooCommerce 主题。Uncode 的设计非常注重细…

C linux struct sigaction

在linux中定义struct sigaction结构体时, 在已经包含signal.h头文件的情况下, 仍旧提示找不到这个结构体. 需要在代码中定义 _POSIX_C_SOURCE 宏&#xff0c;并将其设为大于等于 199309L 的值。这样可以确保相关的函数和结构体在编译时可用。 这将告诉编译器以符合 POSIX 标准要…

vue项目打包成exe

目标&#xff1a;vue的项目打包成为exe可执行文件 工具&#xff1a;需要使用到Electron框架 首先&#xff0c;我们了解一下什么是Electron&#xff1b; Electron 是由 GitHub 开发而成的。它是使用 JavaScript&#xff0c;HTML 和 CSS 构建跨平台的桌面应用程序的框架&#…

[JavaWeb]【三】Maven

目录 一 什么是Maven 二 Maven的作用 2.1 依赖管理 2.2 统一项目目录 2.3 标准项目构建 三 Maven概述 3.1 介绍 3.2 安装 四 IDEA集成Maven 4.1 配置Maven环境 4.1.1 单个项目配置 4.1.1.1 创建项目 4.1.1.2 配置项目JDK版本 4.1.1.3 配置maven 4.1.2 配置全局Maven环…

2023年我国重点水利工程建设全面提速,数字孪生赋能智慧水利

一、水利工程行业概述和分类 从定义上来看&#xff0c;水利工程是用于控制和调配自然界的地表水和地下水&#xff0c;达到除害兴利目的而修建的工程。也称为水工程。 根据观研报告网发布的《中国水利工程行业现状深度调研与投资趋势预测报告&#xff08;2023-2030年&#xff…

入门jdk1.8处理空指针API-Optional

文章目录 入门jdk1.8处理空指针API-Optional类图结构简要说明常用api实践操作应用场景场景一&#xff1a; 对象不为空&#xff0c;做一些逻辑处理场景二&#xff1a;对象为空抛异常&#xff0c;或者对象某个字段为空抛指定异常场景三&#xff1a;级联判空&#xff0c;父节点&am…

【Control Net】第二章——模型介绍,线稿类

ControlNet1.1版本中发布了15个模型,有点过于多了。这里给分成三类: 线稿类(5个) 线稿类顾名思义,是处理线稿的,或者把图片提取成线稿的。 Canny,硬边缘提取 最早的边缘提取算法,提取的效果已经不如Lineart效果好了,处理有些粗糙。 MLSD,直线检测 可以识别建筑、…

【Linux】查看系统内存命令(详细讲解)

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

【Apollo】赋能移动性:阿波罗自动驾驶系统的影响

前言 Apollo (阿波罗)是一个开放的、完整的、安全的平台&#xff0c;将帮助汽车行业及自动驾驶领域的合作伙伴结合车辆和硬件系统&#xff0c;快速搭建一套属于自己的自动驾驶系统。 开放能力、共享资源、加速创新、持续共赢是 Apollo 开放平台的口号。百度把自己所拥有的强大、…

Nvidia Jetson 编解码开发(1)介绍

前言 由于项目需要,需要开发Jetson平台的硬件编解码; 优化CPU带宽,后续主要以介绍硬件编解码为主 1.Jetson各平台编解码性能说明 如下是拿了Jetson nano/tx2/Xavier等几个平台做对比; 这里说明的编解码性能主要是对硬件来说的 2. 编解码实现说明 2.1 软件编解码 优点:…

CAS 一些隐藏的知识,您了解吗

目录 ConcurrentHashMap 一定是线程安全的吗 ConcurrentHashMap 在JDK1.8中ConcurrentHashMap 内部使用的是数组加链表加红黑树的结构&#xff0c;通过CASvolatile或synchronized的方式来保证线程安全的,这些原理已毋庸置疑&#xff0c;一言不合上代码. 模拟2个线程累计&#…

I/O软件层次到底是怎么分的?以及对库函数和系统调用的一些联想

其中&#xff0c;设备驱动程序和中断处理程序是直接和硬件打交道的 相关题目&#xff1a; 将系统调用参数翻译成设备操作命令的工作由&#xff08;&#xff09;完成 A. 用户层I/O&#xff1b; B. 设备无关的操作系统软件&#xff1b;C. 中断处理&#xff1b;D. 设备驱动程序 …

vue3 videojs实现播放器,动态更改src

一、背景 vue3下载第三方插件videojs&#xff0c;达到播放器的效果&#xff0c;并且点击事件能够动态更改播放器的src。实现思路&#xff1a; 场景一&#xff1a;只有一个播放器&#xff0c;当点击事件&#xff0c;直接赋值&#xff0c;动态更改封装好的组件的src参数&#xff…

【AI】如何用AI生成XMind思维导图

哈喽&#xff0c;大家好&#xff0c;我是木头左&#xff0c;物联网搬砖工一名&#xff0c;致力于为大家淘出更多好用的AI工具&#xff01; 背景 随着人工智能技术的不断发展&#xff0c;越来越多的应用场景开始涉及到AI技术。在办公软件领域&#xff0c;XMind是一款非常受欢迎…

阿里云服务区ECS,申请免费的服务器之后,如何使用xshell 登陆,找不到匹配的host key 算法

目录 1 问题2 解决 1 问题 当在阿里云免费领取服务器之后&#xff0c;使用xshell 登陆不上&#xff0c;提示 找不到匹配的host key 算法 或者 找不到匹配的keyexchange算法 咋解决 2 解决 在在服务器端配置文件&#xff1a;/etc/ssh/sshd_config # 在行尾增加",ecdh…

Linux系统编程:通过System V共享内存实现进程间通信

目录 一. 共享内存实现进程间通信的原理 二. 共享内存相关函数 2.1 共享内存的获取 shmget / ftok 2.2 共享内存与进程地址空间相关联 shmat 2.3 取消共享内存与进程地址空间的关联 shmdt 2.4 删除共享内存 shmctl 2.5 通信双方创建共享内存代码 三. 共享内存实现进程间…

基于java/springboot的考研学习平台

摘 要 本毕业设计的内容是设计并且实现一个考研学习平台。它是在Windows下&#xff0c;以MYSQL为数据库开发平台&#xff0c;Tomcat网络信息服务作为应用服务器。考研学习平台的功能已基本实现&#xff0c;主要包括学生、教师、课程信息、学习资源、课程购买、课程发货、课程…