0

0

c++中类构造函数怎么写_c++初始化列表用法【总结】

穿越時空

穿越時空

发布时间:2026-02-10 09:29:44

|

586人浏览过

|

来源于php中文网

原创

初始化列表优于构造函数内赋值:对自定义类型避免多余构造/赋值,且const、引用及无默认构造函数的成员必须用初始化列表;初始化顺序仅由成员声明顺序决定,与列表中顺序无关。

c++中类构造函数怎么写_c++初始化列表用法【总结】

构造函数里直接赋值和用初始化列表,差别在哪

差别在语义和性能:成员变量是先默认构造再赋值,还是直接用参数构造。对自定义类型(比如 std::stringstd::vector 或你自己写的类),前者多一次构造+一次赋值,后者只调一次构造——尤其当类没写移动语义时,开销明显。

更关键的是:const 成员、引用成员、没有默认构造函数的类成员,**必须用初始化列表**,否则编译直接报错:error: uninitialized const membererror: reference member is not initialized

  • 基本类型(intdouble)两者效果一样,但习惯上仍推荐初始化列表,保持统一
  • 基类构造必须在初始化列表里调用,不能放到函数体里
  • 初始化顺序只由成员在类中声明的顺序决定,跟初始化列表里写的顺序无关——这点极易踩坑

初始化列表怎么写才不报错

语法很简单:ClassName() : m_a(1), m_b("hello"), base_class(42) { }。冒号后面是逗号分隔的“成员名(实参)”对。

常见错误:

立即学习C++免费学习笔记(深入)”;

  • 漏掉某个 const 引用成员,编译失败;
  • 把基类构造写成 BaseClass::BaseClass(42) ——错,应该直接写 BaseClass(42)
  • 在列表里调用虚函数(虽然能编译,但此时虚表还没完全建立,实际调的是当前类或基类的版本,行为不可靠);
  • 用尚未初始化的成员去初始化另一个成员,比如 m_b(m_a + 1)m_am_b 后面声明——这时 m_a 还没初始化,值是未定义的

什么时候必须用初始化列表

三种情况绕不开:

MakeSong
MakeSong

AI音乐生成,生成高质量音乐,仅需30秒的时间

下载
  • 成员是 const 类型,例如 const int m_id;
  • 成员是引用,例如 int& m_ref;
  • 成员类型没有默认构造函数,例如你写了 class Data { explicit Data(int); };,然后类里有 Data m_data;

另外,如果基类构造函数不是默认的,派生类也必须在初始化列表里显式调用它;否则编译器找不到匹配的基类构造函数,报 no matching constructor

初始化列表里能做复杂计算吗

可以,但要小心。支持任意表达式,包括函数调用、三目运算、lambda(C++17 起),例如:m_x(calc_value()), m_y(flag ? 10 : 20)

但注意两点:

  • 所有初始化表达式都在构造函数体执行前求值,所以不能依赖 this 指针做成员访问(虽然语法允许,但此时对象还没构造完,行为未定义);
  • 异常安全:如果某个初始化抛异常,已成功初始化的成员会按逆序自动析构——这点比函数体内 try/catch 更干净,但也意味着你要确保初始化顺序合理,避免资源泄漏

真正容易被忽略的是:初始化顺序和声明顺序强绑定。哪怕你把 m_b 写在列表前面,只要它在类里声明在 m_a 后面,m_a 就一定先初始化。这个规则不看代码怎么写,只看头文件里那一行一行怎么排的。

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

668

2023.08.02

scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

331

2023.10.18

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

325

2023.10.25

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

541

2023.09.20

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

668

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

555

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

193

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

205

2025.08.29

Golang处理数据库错误教程合集
Golang处理数据库错误教程合集

本专题整合了Golang数据库错误处理方法、技巧、管理策略相关内容,阅读专题下面的文章了解更多详细内容。

132

2026.02.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 9万人学习

C 教程
C 教程

共75课时 | 4.6万人学习

C++教程
C++教程

共115课时 | 16.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号