为什么C++中使用空括号实例化类不会调用默认构造函数?
C++ 构造函数调用规则相关问题解答
核心歧义规则:最令人烦恼的解析
C++ 标准规定:如果一段代码既可以被解释为函数声明,也可以被解释为对象定义,编译器会优先将其判定为函数声明。这个规则就是常说的「最令人烦恼的解析」,也是Circle c2();被识别为函数的核心原因。
为什么Circle c1(1.0);不会被解析为函数声明?
函数声明的参数列表要求每个参数项为「参数类型 + 可选参数名」的结构,而1.0是浮点字面量,不属于合法的类型语法,因此Circle c1(1.0);完全不符合函数声明的格式,不存在歧义,编译器会直接将其解析为:创建Circle类型的对象c1,传入参数1.0调用对应构造函数。
问题1:既然空括号调用不会触发默认构造函数,为什么默认构造函数的定义要使用空括号?
默认构造函数的本质是无参构造函数,而C++ 所有函数的定义/声明语法都要求参数列表必须用括号包裹,哪怕没有参数也需要写空括号,这是函数定义层面的统一语法规范,和调用时的歧义判定规则属于两个完全独立的语法逻辑,二者并不冲突。
问题2:为什么默认构造函数用()定义,却可以用{}调用?
{}是C++11 新增的列表初始化语法,设计时就专门规避了「最令人烦恼的解析」问题:只要初始化使用{}包裹参数,编译器就不会将其判定为函数声明。
同时列表初始化是通用的初始化规则,会自动匹配对应签名的构造函数,因此无参的默认构造函数也可以通过空列表{}触发调用。
开发建议
实际编码中如果需要调用默认构造函数创建对象,直接使用两种写法即可,避免写空括号的版本踩坑:
Circle c;Circle c{};
内容的提问来源于stack exchange,提问作者user8087992
相关产品推荐
相关产品推荐

