c++ 初始化成员列表

C++的成员初始化列表 成员初始化列表是C++中类构造函数的一部分,它允许在构造函数体之前初始化类的成员变量。相比于在构造函数体内赋值,成员初始化列表有更高效的性能,特别是在初始化常量成员、引用成员和基类时至关重要。成员初始化列表的执行顺序并不是按列表中的书写顺序,而是按照成员变量在类中声明的顺序。常量成员变量一旦声明,必须被初始化,且在之后不能更改。对于自定义类型成员变量,使用成员初始化列表可以避免不必要的默认构造和赋值操作,提升代码性能。必须在初始化列表中初始化,因为它们只能在对象创建时被赋值,不能在构造函数体内赋值。 阅读详情

在c++中,初始化一般有两种方式,一种在构造函数内通过赋值初始化,一种是通过初始化列表初始化。

下面通过对两者进行比较,来分析初始化成员列表和构造函数内赋值的优缺点。

一、构造函数内赋值:

class Text {
public:
	Text() {
		std::cout << "I'm Text Construction" << std::endl;
	}
	Text(int num):_num(num) {
		std::cout << "I'm Text Construction" << "num = " << num << std::endl;
	}

private:
	int _num;
};


class Workers {
public:
	//一、构造函数内通过赋值初始化
	//缺点:无法对const修饰的_sex、或者引用类型_name赋值
	//如果Text类不存在默认构造函数,也会报错
	Workers(){
		_age = 30;
		_weigth = 120;

		//这样写 会调用一次默认构造函数,加一次带参构造函数,因为多调用了一次默认构造函数、效率降低
		_text = Text(15);	
	}
private:
	int _age;
	int _weigth;
	//打开以下注释会报错
	//const std::string _sex;
	//std::string &_name;
	Text _text;	
};

缺点:

1、无法对const修饰的_sex、或者引用类型_name赋值
如果Text类不存在默认构造函数,也会报错。

2、通过_text = Text(15);对_text赋值,会调用一次默认构造函数,加一次带参构造函数,因为多调用了一次默认构造函数、造成效率降低。

二、通过初始化列表初始化:

/*需要使用初始化成员列表时的几种情况
*1、当数据成员是引用时
*2、当数据成员被const修饰时(因为const或者引用只能被初始化,不能赋值)
*3、当数据成员是对象时,该对象无默认构造函数,即有带参的构造函数时
*4、子类需要初始化父类的private数据成员时
*/

class F {
public:
	F(int &num):_num(num) {
		std::cout << "F num:" << _num << std::endl;
	}

private:
	int _num;
};

class WorkersEx : public F
{
public:
	WorkersEx(int &num) : _weigth(120),_name("a"),
		_sex("M"),	//const
		_age(num),	//引用
		_text(num), //对象 只调用一次带参构造函数
		F(num)		//父类
	{}
private:
	int &_age;
	int _weigth;
	const std::string _sex;
	std::string _name;
	Text _text;
};
​

优点:
1、可以对const成员初始化
2、可以对引用类型成员进行初始化
3、对对象进行初始化时,比构造函数内赋值效率更高,因为只调用了一次带参的构造函数,不会调用默认构造函数。而且不需要额外的赋值运算。


需要注意的是:初始化列表初始化的顺序和变量声明的顺序一致,和初始化中的顺序无关。

总结:

推荐使用成员初始化列表,因为其不仅可以满足const和引用数据成员初始化的要求,还可以有效预防初始化带参对象时调用默认构造函数的问题。

C++为什么需要成员初始化列表 将构造函数分为两个阶段的执行过程:初始化阶段和构造函数函数体阶段。 既然称它为成员初始化列表,那么该阶段在初始化阶段完成。 那么类成员变量不外乎类类型和非类类型。而对于非类类型而言,此时 无论是在初始化表中还是函数体内完成赋值效果是一致的,即并未初始化。 表现的有点不同的是类类型: test1: #include using namespace std; class B { pub 阅读详情

相关推荐

对Palantir的本体论的理解

本体论Ontology是Palantir的整个技术架构的核心与基石,它远不止是一个数据模型,而是一个旨在对企业决策本身进行建模的“数字世界的操作系统”。

liuyukuan的专栏 1147

【C++】-- 初始化列表

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

局部变量和全局变量 2万+

五.卡尔曼滤波器(EKF)开发实践之五: 编写自己的EKF替换robot_pose_ekf中EKF滤波器

本系列文章主要介绍如何在工程实践中使用卡尔曼滤波器,分五个小节介绍: 一.卡尔曼滤波器开发实践之一: 五大公式 二.卡尔曼滤波器开发实践之二: 一个简单的位置估计卡尔曼滤波器 三.卡尔曼滤波器(EKF)开发实践之三: 基于三个传感器的海拔高度数据融合 四.卡尔曼滤波器(EKF)开发实践之四: ROS系统位姿估计包robot_pose_ekf详解 五.卡尔曼滤波器(EKF)开发实践之五: 编写自己的EKF替换robot_pose_ekf中EKF滤波器 也就是本文 ...

okgwf的博客 4136

C++基础——初始化列表

C++初始化列表讲解

weixin_69283129的博客 6540

小龙虾 OpenClaw 安装全攻略:本地部署 AI 智能体一步到位

OpenClaw(昵称小龙虾)是一款 MIT 开源协议的本地优先 AI 智能体执行网关,支持多平台接入、本地部署,能实现自然语言驱动的设备自动化操作,区别于纯对话 AI,可直接操控系统执行实际任务,数据全程本地存储更安全。本文带来 2026 最新版 OpenClaw 安装教程,适配 Windows/macOS/Linux 全系统,新手也能一键搞定。

lujiawei00的专栏 1973

嵌入式开发避坑指南:用DWT做延时函数,这几个细节不注意代码会跑飞

本文深入探讨了在Cortex-M嵌入式开发中使用DWT实现精确延时函数的关键技巧与常见陷阱。针对DWT_CYCCNT计数器应用中的内核兼容性、溢出处理、编译器优化等五大核心问题,提供了工业级稳健解决方案,帮助开发者避免代码跑飞风险,实现微秒级高精度延时控制。

weixin_42653691的博客 158

C++初始化列表

一.什么是初始化列表 图中红方框框的就是初始化列表 格式为: :成员变量1(参数1),成员变量2(参数2) 编译器会将初始化列表一一转换成代码,并将这些代码放在用户编写的代码之前。 初始化列表的效果: 使用初始化列表可以提高程序的效率和可读性,因为它可以避免在构造函数体中进行初始化,从而减少了构造函数的执行时间。使用初始化列表还可以确保各个成员变量被正确地初始化,从而避免因未初始化导致的错误。 二.什么时候使用初始化列表 1.有成员变量是引用类型时; ​​​​​​​ 下图是使用了初始

b19839356939的博客 4093

PyCharm 2023最新版安装配置全攻略(附永久激活教程)

本文详细介绍了PyCharm 2023最新版的安装配置全流程,包括版本选择、初始配置、插件生态、工程模板、调试优化及团队协作等关键步骤。特别针对专业版和社区版的功能差异进行对比,帮助开发者高效搭建Python开发环境,提升编码效率与团队协作能力。

p4q5r6s7t的博客 865

C++ 初始化列表详解

C++ 初始化列表详解;什么是初始化列表;初始化列表注意事项

Allen Roson 1万+

ollama使用CPU安装qwen-coder模型_并在eclipse中使用ai coder插件_配置本地qwen-coder模型_ollama常用操作记录---AI大模型应用探索0002

文章摘要:作者分享了在Windows 10上安装和使用Ollama模型的过程。尝试了不同规模的qwen-coder模型(7b、1.5b和0.5b),发现7b模型响应极慢(需35分钟),而1.5b模型表现较好(3秒响应)。最终选择1.5b版本用于代码开发辅助,支持多语言自动补全。同时提到在最新版Eclipse中的AIcoder配置问题。文章重点比较了不同模型规模在CPU环境下的实际使用体验和响应速度差异。

添柴程序猿的专栏 682

梯度提升决策树GBDT原理与代码实例讲解

梯度提升决策树GBDT原理与代码实例讲解 1.背景介绍 1.1 机器学习发展历程 机器学习是人工智能领域的一个重要分支,旨在使计算机具备学习和改进自身性能的能力。随着大数据时代的到来,海量的数据为机器学习算法提供了广阔的应用空间。在

AI天才研究院 1081

C++ 初始化列表

C++ 初始化列表 何谓初始化列表 与其他函数不同,构造函数除了有名字,参数列表和函数体之外,还可以有初始化列表,初始化列表以冒号开头,后跟一系列以逗号分隔的初始化字段。在C++中,struct和class的唯一区别是默认的访问性不同,而这里我们不考虑访问性的问题,所以下面的代码都以struct来演示。 struct foo { string name ; int

mowwwcom的专栏 808

分布式训练中All-Reduce、All-Gather、Reduce-Scatter原理

Reduce-Scatter = 先对所有进程的数据做 Reduce(如 sum / mean),再把结果“切分”分发给各进程。(是 Reduce + Scatter 的融合操作。

comli_cn的博客 340

C++ 语法之【成员初始化列表】

C++ 语法之【成员初始化列表】类对象构造过程定义【成员初始化列表】必须使用【成员初始化列表】的情况情况一:const类成员或者被声明为引用的类成员情况二:初始化成员是对象(包含继承)情况三:子类初始化父类的私有成员必须使用【初始化列表】的原因初始化顺序问题 类对象构造过程 《C++ Primer Plus》中这样描述:从概念上来说,调用构造函数时,对象将在括号中的代码被执行之前被创建。因此,调用构造函数将导致程序先给其成员变量分配内存。然后,程序流程进入到括号中,使用常规的赋值方式将值存储到内存中。 我们

XIONGXING_xx的博客 8122

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

C++成员初始化列表

C++类成员初始化列表C++类型定义C++构造函数的初始化列表定义C++构造函数执行的两个阶段为什么使用初始化列表C++里面哪些东西必须放在初始化列表里面成员变量的初始化顺序 这边文章主要学习C++里面的成员初始化列表。然后分析为什么需要成员初始化列表,C++构造器调用机制与Java区别。 C++类型定义 在C++里面定义一个类型(比如有默认构造器的Test类)的方式一般是: Test t1;...

惜暮 6548

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

C++使用初始化列表初始化数据成员的三种情况

类对象的构造顺序是这样的: 1.分配内存,调用构造函数时,隐式/显示的初始化各数据成员(构造函数列表的初始化方式不是按照列表的的顺序,而是按照变量声明的顺序同时初始化显隐数据成员); 2.进入构造函数后在构造函数中执行一般赋值与计算。 使用初始化列表有两个原因: 原因1.必须这样做: 《C++ Primer》中提到在以下三种情况下需要使用初始化成员列表: 情况一、需要初始化的数据...

yhc166188的博客 1万+

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

C++——初始化成员列表

需要初始化列表成员的情况主要分为:1、派生类成员需要调用基类的构造函数2、类成员变量是常量。3、列表成员存在引用变量。4、列表成员中存在指针变量5、列表成员中存在需要特殊初始化的成员6、存在多个成员变量。

鲸落博客 1028

C++成员初始化列表详解

C++成员初始化列表详解 在初始化类的成员的时候,我们经常会有两种选择,其一是类构造函数的成员初始化列表,其二是构造函数的函数体。那么这两者的区别又是什么,成员初始化列表的具体行为到底是什么呢? 成员初始化列表和构造函数体的区别 成员初始化列表和构造函数的函数体都可以为我们的类数据成员指定一些初值,但是两者在给成员指定初值的方式上是不同的。成员初始化列表使用初始化

Poundssss的博客 8552

C++ 对象——对象之成员初始化列表

成员初始化列表是在构造函数中用于初始化类成员的语法。它在构造函数体执行之前执行。

慢慢记录,慢慢更新。 1839

C++ 成员初始化列表

成员初始化列表是指通过在构造函数的冒号 () 后直接列出数据成员及其初始值来初始化成员的语法。// 构造函数体。

xiaolan7777777的博客 773

C++必须使用【初始化列表】初始化数据成员的三种情况

类对象的构造顺序是这样的: 1.分配内存,调用构造函数时,隐式/显示的初始化各数据成员; 2.进入构造函数后在构造函数中执行一般赋值与计算。 使用初始化列表有两个原因: 原因1.必须这样做: 《C++ Primer》中提到在以下三种情况下需要使用初始化成员列表:    情况一、需要初始化的数据成员是对象的情况(这里包含了继承情况下,通过显示调用父类的构造函数对父类数据成员进行初始化);

小凡的专栏 4万+

c++初始化成员列表

       今天被腾讯电话面试了,15分钟就被秒杀了,其中一个问题“为什么要用成员初始化列表”,我答不上来。回头自己总结了一下。                首先要知道,编译器确保所以成员对象在构造函数执行前被初始化,不论有没有成员初始化列表。代码如下,用Dev C++编译:         #include using namespace std ;class A {pu

水人的专栏 908
上一篇: 使用ubuntu18遇到的一些坑
下一篇: UDP 单播、广播和多播
Qt上位机开发
Qt上位机开发 领域专家: C/C++技术领域 领域专家: C/C++技术领域
博客等级 码龄9年 9664粉丝 178原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值