C++类基础学习之构造函数初始化列表

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

构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式。例如:

class T{
public:
    int a;
    float b;
    //构造函数初始化列表
    CExample(): a(1),b(2)
    {}
    //构造函数内部赋值
    T()
    {
        a=1;
        b=2;
    }
};

上面的例子中两个构造函数的结果是一样的。上面的构造函数(使用初始化列表的构造函数)显式的初始化类的成员;而没使用初始化列表的构造函数是对类的成员赋值,并没有进行显式的初始化。

初始化和赋值对内置类型的成员没有什么大的区别,像上面的任一个构造函数都可以。对非内置类型成员变量,为了避免两次构造,推荐使用类构造函数初始化列表。但有的时候必须用带有初始化列表的构造函数:
1.成员类型是没有默认构造函数的类。若没有提供显示初始化式,则编译器隐式使用成员类型的默认构造函数,若类没有默认构造函数,则编译器尝试使用默认构造函数将会失败。
2.
const成员或引用类型的成员。因为const对象或引用类型只能初始化,不能对他们赋值。 

初始化数据成员与对数据成员赋值的含义是什么?有什么区别?
首先把数据成员按类型分类并分情况说明:
1.内置数据类型,复合类型(指针,引用)
    在成员初始化列表和构造函数体内进行,在性能和结果上都是一样的
2.用户定义类型(类类型)
    
结果上相同,但是性能上存在很大的差别。因为类类型的数据成员对象在进入函数体前已经构造完成,也就是说在成员初始化列表处进行构造对象的工作,调用构造函数,在进入函数体之后,进行的是对已经构造好的类对象的赋值,又调用个拷贝赋值操作符才能完成(如果并未提供,则使用编译器提供的默认按成员赋值行为)

Note:
初始化列表的成员初始化顺序:
    C++初始化类成员时,是按照声明的顺序初始化的,而不是按照出现在初始化列表中的顺序。

    Example:

class T {
   T(int x, int y);
    int m_x;
    int m_y;
};

T::T(int x, int y) : m_y(y), m_x(m_y)
{
}
你可能以为上面的代码将会首先做m_y=I,然后做m_x=m_y,最后它们有相同的值。但是编译器先初始化m_x,然后是m_y,,因为它们是按这样的顺序声明的。结果是m_x将有一个不可预测的值。有两种方法避免它,一个是总是按照你希望它们被初始化的顺序声明成员,第二个是,如果你决定使用初始化列表,总是按照它们声明的顺序罗列这些成员。这将有助于消除混淆
C++子类的构造、析构和拷贝函数 C++子类的构造、析构和拷贝函数子类的构造子类的析构子类的拷贝构造函数 子类的构造 子类的构造在执行它的构造函数前会根据继承表的顺序执行父类的构造函数 1、默认执行父类的无参构造。 2、显式调用有参构造,在子类的构造函数后,初始化列表中显示调用父类对的有参构造函数 class Base { public: char* str; Base(void) { cout << "无参... 阅读详情

相关推荐

C++基础用法—函数括号后面加const

C++基础用法—函数括号后面加const一、作用二、示例代码 一、作用 用于申明类中的成员函数为“只读”函数,即函数后面加了const之后该函数不能改变类的数据成员。 因为在类的成员函数中,有一些成员函数不能改变类的数据成员; 已定义成const的成员函数,一旦企图修改数据成员的值,则编译器按错误处理。 提高程序的可读性和可靠性 常量对象相关 二、示例代码 #include <iostream> using namespace std; class aa{ int num;

LiuXF93的博客 5421

C++类构造函数初始化列表

  构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式。例如:class CExample {public:    int a;    float b;    //构造函数初始化列表    CExample(): a(0),b(8.8)    {}    //构造函数内部赋值    CExample()    {        a=

徐阳的专栏 1551

OpenCASCADE(OCC)读取 STEP 模型文件并在MFC中显示

OpenCASCADE(OCC)读取 STEP 模型文件并在MFC中显示

weixin_61900468的博客 1万+

C++ 成员初始化列表

这里写目录标题数据成员是对象数据成员的类型是const或者引用子类初始化父类的私有成员使用成员初始化列表的优点 在以下三种情况下需要使用初始化成员列表: 需要初始化的数据成员是对象的情况(这里包含了继承情况下,通过显示调用父类的构造函数对父类数据成员进行初始化); 需要初始化const修饰的类成员或初始化引用成员数据; 子类初始化父类的私有成员; 数据成员是对象 如果我们有一个类成员,它本身是一个类或者是一个结构,而且这个成员它只有一个带参数的构造函数,而没有默认构造函数,这时要对这个类成员进行初始化,

TABE_的博客 3274

AlphaFold-multimer 复合物结构预测

是DeepMind开发的AlphaFold项目的一个扩展,旨在预测蛋白质多聚体的三维结构。蛋白质多聚体是由多个蛋白质亚单位相互组装而成的结构,如酶、膜蛋白复合物和病毒颗粒。理解多聚体的结构对于揭示蛋白质的功能和相互作用非常重要。

MurphyStar的博客 5646

从零开始编写一个上位机(串口助手)QT Creator + C++

提示:本博客作为学习笔记,有错误的地方希望指正,此文可能会比较长,作为学习笔记的积累,希望对来着有帮助。   绪论:笔者这里使用的是QTCreator和C++来实现一个简单的串口上位机的开发的简单过程,使用到C++,主要是为了后面使用Python开发上位机打下基础。这里主要分为初识C++的一些基本知识,其次是QT Creator的使用。特别声明感谢【北京迅为】嵌入式学习之QT学习篇的学习视频,这里的学习笔记就是根据视频中的内容实战记录下来的。 文章目录一、C++知识1、初识C++2、C++输入输出控制2.1

believe666的博客 4万+

C++类的学习,规范命名,构造函数,初始化列表等

1. 规范命名在使用类(class)写程序时有以下规范 成员变量的命名//m代表member,同时标清成员的类型和具体名称 int m_iAge; string m_strName; 成员函数及其参数的命名//一般会有设定函数和读取函数,即set和get开头的函数,写参数时在前面加下划线 void setName(string _Name){m_strName = _Name;} st

VSavitar的博客 2577

微信公众号数据采集实战:历史文章、互动数据与评论详情全解析

本文提供了一套完整的微信公众号数据采集实战方案,详细解析了如何通过接口调用获取公众号的历史文章列表、单篇文章的互动数据以及详细的用户评论。文章从环境准备、核心参数解析到分页逻辑、批量处理和异常处理,提供了可运行的Python代码示例,旨在帮助开发者高效、稳定地构建自动化采集工具,用于竞品分析、内容研究和舆情监控。

u5v6w7的博客 1595

C++学习-02<C++ 类和对象:类、构造函数、深/浅拷贝、初始化列表、const、友元>

— 学习笔记

Gnar_w的博客 707

MACS2软件进行Peak calling

MACS2可以检出ChIP-Seq,ATAC-seq 以及 MeRIP-seq (RNA甲基化测序) 等富集的序列。peaks calling 有不同的方法,MACS2是最常用的call peaks工具。 MACS全称Model-based Analysis of ChIP-Seq,最初的设计是用来鉴定转录因子的结合位点,但是它也可以用于其他类型的富集方式测序。usage: macs2 [-h] [--version] {callpeak,bdgpeakcall,bdgbroadca

qq_27390023的博客 3789

【光子 AI 】LangGraph:Graph = 有向有环图 + 状态机实现原理详解:数据结构模型与核心算法代码实现逻辑解析

LangGraph核心原理解析:基于Pregel模型的消息传递图,结合有向有环图和状态机特性。关键实现包括:1) 共享状态机制(TypedDict/Pydantic模型)配合Reducer逻辑实现状态更新;2) 图拓扑结构通过邻接表维护节点和条件边;3) 检查点机制支持状态持久化和恢复。运行时采用Pregel循环算法,通过超级步迭代执行节点函数、应用状态归约、条件路由下一批节点,同时支持人工中断和异步并行处理。该架构使LangGraph具备循环执行、条件跳转等DAG无法实现的动态流程控制能力。

AI天才研究院 1035

LInux C++学习day04 类定义与实例化 构造函数和初始化列表

一 类定义与实例化 1 类的一般语法形式 struct/class 类名:继承方式 基类,…{ 访问控制限定符: 类名(形参表):初始化列表{}//构造函数 ~类名(void){}//析构函数 返回类型 函数名(形参表){}//成员函数 数据类型 变量名;//成员变量 }; 2 访问控制限定符 1)public:公有成员,任何位置都可以访问 2)private:私有成员,只有类内部的成员函数才能访...

weixin_43789711的博客 442

OpenHarmony 显示Display驱动全栈解析:DisplayLayer + Gralloc + Gfx 三位一体,打造高性能图形底座

OpenHarmony Display显示驱动模块是系统图形渲染和显示功能的基础组件,负责管理显示设备、图层渲染、内存分配等核心功能。该模块采用HDI(Hardware Driver Interface)设计架构,为上层图形服务提供统一的显示能力接口,实现了显示设备的初始化、图层管理、内存分配与映射、硬件加速等关键功能。DisplayLayer:负责显示图层的管理, 包括图层创建、显示属性设置、图层填充及刷新等操作;

m0_67505153的博客 315

2018.7.5学习内容:C++类构造函数初始化列表

构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式。例如:class CExample {public:    int a;    float b;    //构造函数初始化列表    CExample(): a(0),b(8.8)    {}    //构造函数内部赋值    CExample()    {        a=0;    ...

qq_42022726的博客 138

断层错动和近断层地震动联合作用下软岩隧洞衬砌损伤分析

摘要 本文提出了一种基于Python的软岩隧洞衬砌损伤分析系统,重点研究断层错动和近断层地震动的联合作用效应。系统采用有限元方法建立隧洞-围岩体系模型,通过非线性动力分析评估衬砌结构损伤。研究内容包括:1)建立考虑应变软化的软岩本构模型;2)基于位错理论模拟断层错动过程;3)合成具有速度脉冲效应的近断层地震动;4)开发完整的动力响应分析流程。结果表明,所提出的方法能有效评估软岩隧洞在复杂地质条件下的抗震性能,为工程设计提供理论依据。 关键词:软岩隧洞、断层错动、近断层地震动、损伤分析、Python、有限元法

max500600的博客 842

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

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

C++学习笔记“类和对象”;对象的初始化和清理,构造函数和析构函数,初始化列表,静态成员

C++学习笔记“类和对象”;对象的初始化和清理,构造函数和析构函数,初始化列表,静态成员

qq_50259950的博客 1072

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

C++基础知识学习,static详解,类的标准写法,类的隐式类型转换,构造函数初始化列表,const函数

声明文件的类与变量的不同 .h文件中,类的声明文件(包含防卫式头)可以在多个cpp文件中引用 但是如果声明的是变量,多个cpp文件都include的话,一定会报错 不要问为什么,就是这样设计的 从第一个有默认值的参数开始,之后的参数都必须有默认值 类通过构造方法的隐式转换 如果一定义一个类,像通过这样一种方式直接初始化类 className abc = 12 那么你可以通过构造方法实现 test...

qq_40666620的博客 201

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

【C++奇遇记】构造函数 | 初始化列表

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

m0_64361522的博客 1188

【C++初阶:类和对象(下篇)】初始化列表 | static成员 | 友元

这篇文章是对类和对象的一个补充

DanceBit的博客 1537

C++类成员和数据成员初始化总结

C++类成员和数据成员初始化总结

qq_43661309的博客 289

《C++学习》初始化列表

构造函数():属性1(值1),属性2(值2)···{}C++提供了初始化列表语法,用来初始化属性。

qq_74941421的博客 258

类初始化列表

•    常量成员,因为常量只能初始化不能赋值,所以必须放在初始化列表里面     •    引用类型,引用必须在定义的时候初始化,并且不能重新赋值,所以也要写在初始化列表里面     •    没有默认构造函数的类类型,因为使用初始化列表可以不必调用默认构造函数来初始化,而是直接调用拷贝构造函数初始化。

学以致用 623

C++学习之路-构造函数的初始化列表

初始化列表何为初始化列表初始化列表的本质初始化列表的优势初始化列表中列表顺序问题初始化列表与默认参数的配合使用初始化列表的注意之处构造函数的声明和实现分离时,初始化列表需写在实现里子类调用父类的构造函数初始化列表总结 何为初始化列表 定义:一种便捷的初始化类内成员变量的方式。 初始化成员变量通常在构造函数里执行,如下例所示。成员变量的初始化可以通过调用有参的构造函数进行传参初始化,也可以通过调用无参的构造函数在函数体内部直接初始化(可以看我之前的博文)。下例展示了调用有参的构造函数始化成员变量的方式。

weixin_45452278的博客 1万+

C++构造函数体内初始化与列表初始化的区别

本文探讨C++构造函数体内初始化与列表初始化的区别: 结论是: 若某个类(下文的class B)有一个类成员是类类型(下文的class A),那么 1、若类B通过构造函数体内初始化,会先调用类A的默认构造函数(无参构造函数),再调用类A的赋值运算符; 2、若类B通过初始化列表去初始化,则只调用类A的拷贝构造函数。 另外,虽然对于成员类型是内置类型的情况,通过上述两种情况去初始化是相同的,但是为了标...

weixin_41675170的博客 5387

类——构造函数之初始化列表

​ 在我们已经基本了解了类的由来,和其六大基本默认函数后,此时我们再回过头来看,其中的构造函数。在前文已经说过构造函数的作用为初始化成员变量,但是真的就这么简单了吗?如果成员变量为常变量(const)那还能构造成功吗?在构造函数体内部,我们直接可以用类的成员变量来赋值,但是在调用构造函数前是没有这个类对象的,既然都没有这个类对象,哪前面我们直接用来赋值的类中的成员变量是哪里来的?

qq_68140277的博客 6241

C/C++ : 构造函数的初始化列表

一、什么是初始化列表 与一般函数不同,构造函数除了有名字、形参列表和函数体外,还可以有初始化列表。初始化列表以冒号开头,后跟一系列以逗号分隔的初始化字段。下面用一个例子来说明初始化列表的使用: (Point类表示平面上的一个点,有两个私有成员x, y,分别表示该点的x, y坐标的值。) class Point { public: Point(int xx, int ...

Lee's Blog 8884
上一篇: 面向对象与面向过程区别
下一篇: C++基础学习之静态变量
ithLiu
博客等级 码龄10年 26粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值