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

零、HarmonyOS应用开发者基础学习总览

零、HarmonyOS应用开发者基础学习总览

weixin_45029825的博客 1453

C++ 成员初始化列表

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

TABE_的博客 3274

神经网络:初学者指南(专业版)

神经网络是一种受生物大脑启发的计算模型,由多层互连的人工神经元组成。本文从生物神经元结构出发,介绍了感知器模型、激活函数、网络架构(输入/隐藏/输出层)等基础概念,并详细阐述了前向传播、反向传播、损失函数和优化器等核心训练机制。同时涵盖了CNN、RNN等常见架构,以及过拟合、梯度消失等关键挑战,最后概述了神经网络在计算机视觉、NLP等领域的广泛应用。全文系统性地梳理了神经网络的基础理论和实践要点,为初学者提供了清晰的学习路径。

weixin_42107409的博客 1782

PCIe Crosslink

PCIe Crosslink(交叉连接)是一种特殊的PCIe链路连接方式,允许两个PCIe设备(通常是Root Complex或Endpoint)是指两个PCIe设备(如两个CPU、两个FPGA或两个GPU)通过PCIe链路直接连接,形成点对点(P2P)通信通道。:两个Intel/AMD CPU通过PCIe Crosslink直接通信(替代UPI/Infinity Fabric)。:主板需提供PCIe Crosslink连接(如特定插槽支持x16/x8 Crosslink)。

zly8865372的博客 1636

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

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

VSavitar的博客 2577

MTK 人工智能生态系统 <一> 简介

Neuropilot

New_Tank的博客 3495

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

— 学习笔记

Gnar_w的博客 707

Python 爬虫实战:爬取哔哩哔哩知识区,抓取高赞课程信息

哔哩哔哩(Bilibili)是一个广受欢迎的综合性视频社区,其中的知识区汇聚了大量优质的教育、科普、技术等课程内容。本文将指导读者如何使用 Python 爬虫技术从哔哩哔哩知识区抓取高赞课程信息,并进行数据分析。本文深入探究了利用 Python 爬虫技术从哔哩哔哩知识区抓取高赞课程信息的全流程。从前期的环境搭建、模拟登录,到核心的课程数据抓取、存储,再到后续的数据分析与可视化,都详细展开讲解并提供代码支持。通过此方法所获取的数据,能够助力创作者优化内容、用户发现优质课程、平台洞察用户需求。

u014481728的博客 1136

用 ABAP EML 驾驭 RAP 业务对象:从事务缓冲区到落库提交的一条龙实践

摘要:ABAP EML(Entity Manipulation Language)是SAP RAP框架的核心语言能力,为ABAP开发者提供强类型、批处理友好的方式操作RAP业务对象。EML通过事务缓冲区管理数据变更,支持读取(READ ENTITIES)、修改(MODIFY ENTITIES)及事务控制(COMMIT/ROLLBACK ENTITIES)。其特点包括:基于BDEF派生类型确保类型安全,%control和%cid等特殊字段实现精细控制,统一的消息模型便于错误处理。相比传统ABAP数据访问方式,

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 951

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

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

weixin_43789711的博客 442

菜鸟哥玩蓝牙Ble4.0系列 ESP32初玩篇③ Beacon —— 广播应用,室内定位,内容推送

文章目录1、前言1.1 什么叫做Beacon?1.2 Beacon使用场景1.3 Beacon协议落地实现2、ESP32 Beacon案例3、Beacon核心库 —— BLEBeacon、BLEEddystoneTLM、BLEEddystoneURL3.1 BLEBeacon3.2 BLEEddystoneTLM3.3 BLEEddystoneURL 授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力。希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石。。。

单片机菜鸟哥的博客 2万+

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

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

qq_42022726的博客 138

yolov26改进 | Neck/颈部创新篇 | 独创HFPN利用分层特征融合块HFFB模块融合多层次特征改进yolov26(全网独家创新)

本文提出了一种创新的分层特征融合模块HFFB(Hierarchical Feature Fusion Block)来改进YOLOv26的neck部分,构建了名为HFPN的新型特征金字塔网络。该模块通过三分支结构融合局部特征(CNN提取)、全局特征(Swin Transformer提取)和中间特征,并包含空间注意力(SA)、通道注意力(CA)和残差反向MLP(IRMLP)等组件来优化特征融合效果。实验表明,该方法能针对不同尺度目标(大/中/小)进行自适应检测,可根据具体数据集需求选择不同配置。文章详细提供了核

Snu77的博客 483

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

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

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

qq_50259950的博客 1072

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

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

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

qq_40666620的博客 201

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

【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、付费专栏及课程。

余额充值