news 2026/10/3 2:30:32

【C++】初始化列表

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【C++】初始化列表

目录

1. 含义 和 基本语法

2. 为什么使用初始化列表?

2.1 使用初始化列表,效率更高

2.2 有些成员必须使用初始化列表

3.初始化顺序

4. 给缺省值初始化

5. 与在函数体内赋值的区别


1. 含义 和 基本语法

含义:

  • 之前学过的构造函数初始化,是以在函数体内赋值的方式初始化的,
  • 而初始化列表是构造函数的一部分,用于在创建对象时直接初始化成员变量,而不是先在函数体内赋值。

语法:

class A { int x; const int y; int& r; public: A(int a, int b, int& ref) : x(a), y(b), r(ref) { // 函数体 } };
  • 冒号:后面是初始化列表。

  • 每个成员用 成员名(值)或 成员名 {值}(C++11)表示。

  • 多个成员用逗号分隔。


2. 为什么使用初始化列表?

2.1 使用初始化列表,效率更高

首先要知道:C++规定,一个对象在真正进入构造函数的大括号{}之前,它的所有成员变量都已经完成了 初始化。

在函数体内赋值:

class Date { public: // 函数体内赋值的方式初始化 Date(int year,int month,int day) { _year = year; _month = month; _day = day; } private: int _year; int _month; int _day; };
  1. 初始化阶段(进入大括号前):编译器先给_year和_month分配内存。由于没在初始化列表里写,编译器会执行默认初始化。对于内置类型int,就是随便填个随机垃圾值(比如_year现在是乱码)。

  2. 赋值阶段(进入大括号后):执行_year = year;,把参数的值赋给原本已是垃圾值的_year。

使用初始化列表:

class Date { public: // 初始化列表初始化 Date(int year, int month, int day) :_year(year), _month(month), _day(day) {} private: int _year; int _month; int _day; };
  1. 初始化阶段(进入大括号前):编译器分配内存的同时,直接用参数year来构造_year。一步到位,没有垃圾值,也没有后续的赋值操作。

效率差距在哪里?

对于 内置类型,赋值和初始化效率一样,就是改内存。

但如果成员变量是自定义类型,差别就巨大了:

  • 假设类里有个成员对象,对它赋值初始化,会先调用它的默认构造,进入大括号后,再调用赋值运算符重载。一共经历了两次函数调用。
  • 而用初始化列表初始化,直接调用它的拷贝构造函数。只有一次函数调用,效率更高。

2.2 有些成员必须使用初始化列表

  • const 成员:因为不能在函数体内赋值初始化,所以只能只能用初始化列表初始化
  • 引用:必须在定义时绑定,不能重新绑定
  • 没有默认构造的类:因为对类进行初始化时,会调用它的默认构造,如果它没有默认构造,就会报错,所以没有默认构造的类必须用初始化列表初始化

3.初始化顺序

成员初始化顺序由它们在类中声明的顺序决定,与初始化列表中的书写顺序无关。如下:


4. 给缺省值初始化

可以在声明成员时直接给默认值:

class A { int x = 0; int y = 1; public: A(int a) : x(a) {} // y 仍使用默认值 1 };

如果成员在初始化列表中也被指定,则缺省值被忽略,比如上面代码中,x在初始化列表被初始化,缺省值被忽略。


5. 与在函数体内赋值的区别

方式过程适用性
初始化列表直接调用构造函数/初始化所有成员,包括 const、引用、无默认构造的类类型
函数体内赋值先默认构造,再调用赋值运算符仅适用于可默认构造且可赋值的成员
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/3 2:29:53

千古前端图文教程:JavaScript 递归函数完全指南——概念、递归要素与三大经典案例(阶乘 / 喇叭花数 / 斐波那契)

文档教程前端 【免费下载链接】Web 千古前端图文教程,超详细的前端入门到进阶知识库。从零开始学前端,做一名精致优雅的前端工程师。 项目地址: https://gitcode.com/gh_mirrors/we/Web 点击查看 免费下载 导读 递归(Recursion&…

作者头像 李华
网站建设 2026/10/3 2:28:20

asc-devkit API UT 覆盖率扫描实战:从接口清单提取到跨架构缺失报告

人工智能深度学习算子库CANNAscend 【免费下载链接】asc-devkit 本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言,原生支持C和C标准规范,主要由类库和语言扩展层构成,提供多层级API,满足多维场景算子开发诉求。 项目地址&…

作者头像 李华