C++ 初始化列表

c++中构造函数和初始化列表 我不是笔记的创造者,我只是笔记的搬运工~ 1 ,构造函数可以重载,也可以带有缺省参数 匹配string的无参构造函数 string s; 匹配string的有参(const char*)构造函数 string s("hello"); 2 ,缺省构造函数(无参构造函数) 1)如果类中没有定义任何构造函数,编译器会为该类提供一个... 阅读详情


何谓初始化列表

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

struct foo
{
    string name ;
    int id ;
    foo(string s, int i):name(s), id(i){} ; // 初始化列表
};

构造函数的两个执行阶段

构造函数的执行可以分成两个阶段,初始化阶段和计算阶段,初始化阶段先于计算阶段。

初始化阶段

所有类类型(class type)的成员都会在初始化阶段初始化,即使该成员没有出现在构造函数的初始化列表中。

计算阶段

一般用于执行构造函数体内的赋值操作,下面的代码定义两个结构体,其中Test1有构造函数,拷贝构造函数及赋值运算符,为的是方便查看结果。Test2是个测试类,它以Test1的对象为成员,我们看一下Test2的构造函数是怎么样执行的。

复制代码
struct Test1
{
    Test1() // 无参构造函数
    { 
        cout << "Construct Test1" << endl ;
    }

    Test1(const Test1& t1) // 拷贝构造函数
    {
        cout << "Copy constructor for Test1" << endl ;
        this->a = t1.a ;
    }

    Test1& operator = (const Test1& t1) // 赋值运算符
    {
        cout << "assignment for Test1" << endl ;
        this->a = t1.a ;
        return *this;
    }

    int a ;
};

struct Test2
{
    Test1 test1 ;
    Test2(Test1 &t1)
    {
        test1 = t1 ;
    }
};
复制代码

调用代码

Test1 t1 ;
Test2 t2(t1) ;

输出

解释一下,第一行输出对应调用代码中第一行,构造一个Test1对象。第二行输出对应Test2构造函数中的代码,用默认的构造函数初始化对象test1,这就是所谓的初始化阶段。第三行输出对应Test1的赋值运算符,对test1执行赋值操作,这就是所谓的计算阶段。

为什么使用初始化列表

初始化类的成员有两种方式,一是使用初始化列表,二是在构造函数体内进行赋值操作。使用初始化列表主要是基于性能问题,对于内置类型,如int, float等,使用初始化类表和在构造函数体内初始化差别不是很大,但是对于类类型来说,最好使用初始化列表,为什么呢?由上面的测试可知,使用初始化列表少了一次调用默认构造函数的过程,这对于数据密集型的类来说,是非常高效的。同样看上面的例子,我们使用初始化列表来实现Test2的构造函数

struct Test2
{
    Test1 test1 ;
    Test2(Test1 &t1):test1(t1){}
}

使用同样的调用代码,输出结果如下。

第一行输出对应 调用代码的第一行。第二行输出对应Test2的初始化列表,直接调用拷贝构造函数初始化test1,省去了调用默认构造函数的过程。所以一个好的原则是,能使用初始化列表的时候尽量使用初始化列表。

哪些东西必须放在初始化列表中

除了性能问题之外,有些时场合初始化列表是不可或缺的,以下几种情况时必须使用初始化列表

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

对于没有默认构造函数的类,我们看一个例子。

复制代码
struct Test1
{
    Test1(int a):i(a){}
    int i ;
};

struct Test2
{
    Test1 test1 ;
    Test2(Test1 &t1)
    {
        test1 = t1 ;
    }
};
复制代码

以上代码无法通过编译,因为Test2的构造函数中test1 = t1这一行实际上分成两步执行。

1. 调用Test1的默认构造函数来初始化test1

2. 调用Test1的赋值运算符给test1赋值

但是由于Test1没有默认的构造函数,所谓第一步无法执行,故而编译错误。正确的代码如下,使用初始化列表代替赋值操作。

struct Test2
{
    Test1 test1 ;
    Test2(Test1 &t1):test1(t1){}
}

成员变量的初始化顺序

成员是按照他们在类中出现的顺序进行初始化的,而不是按照他们在初始化列表出现的顺序初始化的,看代码。

struct foo
{
    int i ;
    int j ;
    foo(int x):i(x), j(i){}; // ok, 先初始化i,后初始化j
};

再看下面的代码

struct foo
{
    int i ;
    int j ;
    foo(int x):j(x), i(j){} // i值未定义
};

这里i的值是未定义的,虽然j在初始化列表里面出现在i前面,但是i先于j定义,所以先初始化i,但i由j初始化,此时j尚未初始化,所以导致i的值未定义。所以,一个好的习惯是,按照成员定义的顺序进行初始化。

Spring AI Alibaba实战训练营-20 基于注解驱动的MCP快速开发入门指南 本文详细讲解如何使用SpringAiAlibaba快速开发基于注解驱动的MCP应用。文章详细介绍了MCP协议并且重点介绍了Spring AI通过注解驱动的开发方式简化MCP服务开发。具体包括服务端和客户端的注解使用、城市最新时间查询MCP项目结构概览(服务端和客户端模块)以及环境配置要求。 阅读详情

相关推荐

Obsidian的Git插件设置配置全流程 -- 简单的电脑端多平台同步方案及常见问题

Git同步obsidian的保姆级教程和常见问题

weixin_44370439的博客 1万+

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

一、初始化与赋值的区别 意义上: 1)初始化:一个变量或者一个对象在产生的时候就赋予一个值,属于伴随性质 2)赋值:在一个变量或者一个对象在产生之后的任意时刻赋予一个值,属于任意性质 宏观代码上: 1)两者作用相同 2)对于数组和结构体来说,初始化和赋值的的形式不同。对于数组,可以使用花括号一起初始化,如果赋值的话,就只能单个元素就行;对于结构体,可以使用花括号初始化,否则只能通过“.”来访问变量进行赋值 二、构造函数特点 1、造函数也是一个函数,这个函数有几个特点: 1)函数的名字与类的名字相同 2)在创

qq_42314223的博客 1711

Stata实战:5步搞定PSM倾向得分匹配(附完整代码与常见报错解决)

本文详细介绍了使用Stata进行PSM(倾向得分匹配)的5步实战流程,包括数据预处理、模型构建、匹配算法选择、匹配质量诊断和结果解释。提供完整代码示例和常见报错解决方案,帮助研究者高效完成实证分析,提升匹配成功率。

weixin_29214559的博客 590

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

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

weixin_45452278的博客 1万+

实战指南:彻底清除TIA Portal卸载后遗留的SQL Server WinCC实例

本文详细介绍了如何彻底清除TIA Portal卸载后遗留的SQL Server WinCC实例,解决重新安装时的冲突问题。通过控制面板排查、注册表验证、安全卸载操作流程和注册表深度清理等步骤,确保完全移除残留组件,避免系统崩溃。文章还提供了安装环境重建策略和预防措施,帮助工程师高效管理西门子自动化软件。

weixin_30482181的博客 405

UE5笔记【十二】蓝图函数BluePrint Function

蓝图函数BluePrint Function。蓝图类。蓝图变量。

xiaoyaolangwj的博客 4393

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

C++构造函数与初始化列表写在前面初始化函数初始化列表 写在前面 最近开始刷力扣了,对于刷题过程中遇到的不熟练的语法和操作,在这里记录一下并加深印象。今天要写的是C++的构造函数与初始化列表。 初始化函数 C++初始化函数对类中的成员进行初始化,可以为已经分配内存的变量赋初值,也可以为非静态成员变量分配内存并初始化。 具体写法为: class UnionFind{ private: vector<int> parent; int num;//连通域数量 public: U

weixin_42658887的博客 1028

论deepseek软件底层原理

如处理医学文本时,将任务分配给擅长医学知识处理的专家,避免通用模块处理的低效性,极大提升计算效率与任务处理的针对性。教师模型复杂且强大,学生模型结构简单。协作处理:多模块协作时,建立数据流通与交互机制,各模块按顺序或并行处理数据,不断传递与更新中间结果,共同完成复杂任务。(一)输入处理与任务判断 输入预处理:接收输入数据,如用户文本提问,首先进行清洗,去除噪声数据、特殊字符等。任务分类:通过MoE架构“路由器”,依据输入数据特征,判断任务所属领域与类型,如文本分类、情感分析等,为后续处理模块选择提供依据。

欢乐打代码! 2738

【CPP11新特性,列表初始化】列表初始化与初始化列表是不是一个概念?列表是怎么初始化的?

CPP11列表初始化语法点介绍,列表初始化与初始化列表概念?列表是怎么初始化的简单介绍。

BinaryWiker的博客 1300

黑猫带你学eMMC协议第9篇:eMMC初始化过程(initial)

本文依据eMMC JEDEC5.1及个人工作经验整理而成,如有错误请留言。 文章为个人辛苦整理,付费内容,禁止私自转载。 文章所在专栏:《黑猫带你学:eMMC协议详解》 1 什么是emmc的初始化 对于小白来说,可能不太明白什么是emmc初始化。举个栗子:当你拿到一个电脑,接上电源,是不是就立马可以用了呢?并不是吧,你还需要去开机,等待电脑启动,配置完各种参数,等出现了电脑桌面,你才能用。那么同样,对于emmc芯片来说,也不是提供电源就能用了,需要输入各种命令后,让其进入到tran state后,才能正.

黑猫奥利奥的博客 6741

YOLOv5基于深度学习的道路缺陷检测系统

然而,由于长期的自然侵蚀、车辆磨损等因素,道路表面容易出现裂缝、坑洼等缺陷。这些缺陷不仅会影响驾驶舒适性,还可能引发交通事故,尤其是在恶劣天气或夜间行车条件下。随着人工智能技术的快速发展,基于深度学习的道路缺陷检测技术能够在降低人力成本的同时提高检测效率,为道路维护提供了新的解决方案。本项目构建了基于YOLOv5的道路缺陷检测系统,结合PyQt5开发了用户友好的UI界面,具备实时检测和图片分析功能。工具对图片进行标注,生成YOLO格式的标注文件。上传包含道路裂缝或坑洼的图片,系统会标注出缺陷的位置及类别。

YOLO 1076

C++ 初始化列表详解

初始化列表(Initialization List)是 C++ 中构造函数的一种特殊语法,用于在对象创建时直接初始化成员变量,而不是在构造函数体内赋值。其基本语法如下:cppClassName::ClassName(参数列表): member1(初始值), member2(初始值), ...// 构造函数体(可选)

hello world/linux 3169

Windows2008使用-解决漏洞-CVE-2010-2730

随着硬件的升级,操作系统也逐渐进行了版本更新。目前阶段,Windows2016Server、Windows2022Server逐渐成为了以Windows系列的服务器平台系统。对于有些应用而言,由于其业务的固定,可能仍只能运行在Windows2008Server或者Windows2012Server上。有时候我们为安全需要,需要将相关的操作系统涉及的漏洞做修复。最近碰到在一个Windows2008R2 的操作系统漏洞CVE-2010-2730,一顿操作,终于找到了合适的方案,这里分享给大家。

mystonelxj的博客 2314

【C++】初始化列表是什么?初始化列表有什么作用?我们必须要使用初始化列表吗?

在C++中,优先使用初始化列表来初始化自定义类型的成员变量,因为无论如何,成员变量总会在初始化列表中先被初始化。每个成员变量在列表中只能出现一次,意味着初始化不能重复。成员变量的声明顺序决定了其初始化顺序,而与初始化列表的顺序无关。 对于类成员中的引用,必须通过初始化列表进行赋值,因其在定义时必须初始并且不可更改。直接赋值会导致引用对象多次修改,可能引发未定义行为,因此使用初始化列表能确保在对象创建时正确初始化引用对象,提高代码可读性和维护性。 关于初始值,初始化列表的优先级最高,其次是成员变量声明时的

寒雒的博客 2840

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

c++ 初始化列表_C++ 列表初始化详解

(给CPP开发者加星标,提升C/C++技能)来源:Rayen0715https://blog.youkuaiyun.com/hailong0715/article/details/54018002【导读】:在我们实际编程中,我们经常会碰到变量初始化的问题,对于不同的变量初始化的手段多种多样,比如说对于一个数组我们可以使用 int arr[] = {1,2,3}的方式初始化,又比如对于一个简单的结构体...

weixin_39636540的博客 1541

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

C++11列表初始化 {}

C++11引入的列表初始化{}提供了一种统一、安全的初始化方式,具有以下核心特性:1)统一语法,适用于基本类型、数组、结构体、类和容器;2)禁止窄化转换,防止数据精度丢失;3)支持通过std::initializer_list实现容器批量初始化。相较于传统初始化方式,列表初始化显著简化了代码,提高了安全性,特别是在容器初始化和类型转换方面表现突出。该特性使C++的初始化语法更加现代化和规范化。

TTKunn的博客 1649

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

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

【C++】初始化列表

尽量使用初始化列表初始化,不在初始化列表初始化的成员也会走初始化列表因为所有成员包括内置类型和类类型的初始化必定发生在构造函数体执行之前。(没有显示出现在初始化列表中的成员,对于内置类型,执行默认初始化,对于类类型的成员,编译器也会隐式地在初始化阶段调用它们的默认构造函数,因此这些成员的初始化过程仍然发生在构造函数体之前,即“走”了初始化列表的过程)若成员声明时有默认成员初始化器,且初始化列表未显示初始化该成员,则使用该缺省值进行初始化;

2302_81312180的博客 2035

【C++11】之列表初始化

在 C++98 中,列表初始化是通过使用花括号{}对数组或结构体元素进行初始化的一种语法。这种语法的引入使得初始化操作更为统一,并提供了一种清晰而简洁的方式。然而,在 C++98 中,这种初始化方式的适用范围相对有限,仅限于数组和结构体。是 C++11 引入的一种用于表示初始化列表的标准库类型。它的主要作用是作为构造函数的参数,方便地进行初始化操作。通过统一列表初始化和的引入,C++11在初始化方面提供了更为一致、灵活和方便的语法,为代码编写和维护带来了显著的便利。

m0_61476090的博客 1418

Cpp中的初始化列表

Cpp中的初始化列表问题的发现问题的解决 问题的发现 在我定义一个Class A的时候,其中的成员函数包含class Phone。class A中的成员定义在前,构造函数在后。当我不使用初始化列表的时候,使用有参构造函数,编译不通过: class Phone { public: string brand; //Phone() { // cout << "默认构造函数" << endl; //}; Phone(string temp){ brand = temp; c

gtmdCSN的博客 640

C++11 就地初始化与列表初始化

C++11之前,C++主要有以下几种初始化方式://小括号初始化 string str(&amp;amp;quot;hello&amp;amp;quot;);//等号初始化 string str=&amp;amp;quot;hello&amp;amp;quot;;//大括号初始化 struct Studnet{ char* name; int age; }; Studnet s={&amp;amp;quot;dablelv&amp

Doublelv 的博客专栏。 1万+

C++初始化列表

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

轻松学C语言 2199

C++ 列表初始化详解

C++ 列表初始化详解

嗨,欢迎来到我的 优快云 博客小天地!一名深耕多年的技术发烧友。在这里,我将把日常工作中积累的宝贵经验,从复杂架构设计的精妙之处,到代码优化的实战技巧,毫无保留地分享给大家。 1286

什么是C++初始化列表

为什么要有初始化列表,初始化列表的作用什么,那些情况下必须要用初始化列表,这应该是令c++初学者头疼的问题了。 下面就简单介绍一下 首先什么初始化列表呢,我们先理解一下这个概念,c++对象的创建首先是开辟内存,然后调用构造函数,这里构造函数就分为隐式初始化和显示初始化,隐式初始化就没有初始化列表,显示就有。 我们知道对象 ...

Victor_psl的博客 1721

【C++11】列表初始化

详细讲解C++11——列表初始化

tan_run的博客 1077
上一篇: 视频码率,帧率和分辨率的联系与区别
下一篇: 解决VS2010编译工程速度慢的问题
mincheat
博客等级 码龄17年 46粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值