0

0

C++构造函数重载规则_C++多种初始化方式说明

冷炫風刃

冷炫風刃

发布时间:2025-12-25 17:50:03

|

798人浏览过

|

来源于php中文网

原创

构造函数重载允许类定义多个参数列表不同的构造函数,编译器依实参和初始化语法选择匹配项;需满足可区分性,避免默认参数冲突;委托构造、explicit限定和initializer_list优先级等规则共同影响调用行为。

c++构造函数重载规则_c++多种初始化方式说明

构造函数重载在C++中允许一个类定义多个构造函数,只要它们的参数列表不同(类型、数量或cv限定符不同),编译器就能根据初始化时提供的实参自动选择最匹配的一个。初始化方式则决定了调用哪个重载构造函数,也影响对象是否能被正确创建。

构造函数重载的基本规则

重载构造函数必须满足“可区分性”:参数列表不能仅靠返回类型或默认参数差异来区分;不能有多个构造函数接受完全相同的实参类型组合。

  • 参数类型不同即可重载,例如 A(int)A(double)
  • 参数个数不同也可重载,例如 A()A(int)A(int, int)
  • 带默认参数的构造函数要小心:A(int x = 0)A() 会冲突,因为两者都可被无参调用
  • 委托构造函数(C++11起)允许一个构造函数调用同类另一个构造函数,但只能出现在初始化列表中,且自身不能有其他成员初始化

直接初始化 vs 拷贝初始化

初始化语法不同,可能触发不同重载,甚至影响是否允许隐式转换

  • 直接初始化A a(1);A a{1}; —— 编译器尝试匹配所有可行构造函数,包括 explicit 构造函数
  • 拷贝初始化A a = 1;A a = A(1); —— 只考虑非 explicit 构造函数,且可能多一次隐式转换(C++17前可能省略,但语义上仍要求可拷贝/移动)
  • A a{1, 2}; 是列表初始化,优先匹配 initializer_list 构造函数(如果存在),否则按聚合或逐个参数匹配

常见初始化方式与对应构造函数调用

同一类的不同初始化写法,可能调用完全不同的重载构造函数。

超会AI
超会AI

AI驱动的爆款内容制造机

下载

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

  • MyClass m; → 默认构造函数 MyClass()
  • MyClass m(42); → 匹配 MyClass(int)
  • MyClass m = 42; → 若 MyClass(int) 是 explicit,则编译失败;否则调用它
  • MyClass m{3.14}; → 若有 MyClass(double),且无 MyClass(std::initializer_list),则调用前者;若有后者,优先调用后者
  • MyClass m{}; → 值初始化,调用默认构造函数(若为类类型)或零初始化(若为POD)

explicit 关键字的作用与陷阱

explicit 用于防止非预期的隐式类型转换,只对单参数构造函数(或其余参数均有默认值)有意义。

  • 声明为 explicit MyClass(int) 后,MyClass m = 10; 非法,但 MyClass m(10);MyClass m{10}; 合法
  • C++11起,explicit 也支持修饰转换运算符,限制隐式转换目标类型
  • 多个参数的构造函数加 explicit 无意义(本来就不会隐式调用),但 C++11 允许语法上存在,C++17 起才禁止

基本上就这些。构造函数重载和初始化方式紧密耦合,理解它们的关键是记住:编译器选函数看实参类型和初始化语法,而 explicit 和 initializer_list 会显著改变匹配行为。

相关专题

更多
java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1428

2023.10.24

Go语言中的运算符有哪些
Go语言中的运算符有哪些

Go语言中的运算符有:1、加法运算符;2、减法运算符;3、乘法运算符;4、除法运算符;5、取余运算符;6、比较运算符;7、位运算符;8、按位与运算符;9、按位或运算符;10、按位异或运算符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

221

2024.02.23

php三元运算符用法
php三元运算符用法

本专题整合了php三元运算符相关教程,阅读专题下面的文章了解更多详细内容。

69

2025.10.17

string转int
string转int

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

311

2023.08.02

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

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

510

2024.08.29

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

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

46

2025.08.29

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

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

177

2025.08.29

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

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

46

2025.08.29

苹果官网入口直接访问
苹果官网入口直接访问

苹果官网直接访问入口是https://www.apple.com/cn/,该页面具备0.8秒首屏渲染、HTTP/3与Brotli加速、WebP+AVIF双格式图片、免登录浏览全参数等特性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

147

2025.12.24

热门下载

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

精品课程

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

共94课时 | 5.2万人学习

C 教程
C 教程

共75课时 | 3.6万人学习

C++教程
C++教程

共115课时 | 9.8万人学习

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

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