c++默认构造函数指可不提供实参调用的构造函数,包括无参构造函数和所有参数均有默认值的构造函数;编译器仅在类未声明任何构造函数时隐式生成无参版本,且不初始化内置类型。

不一定。C++标准中定义的默认构造函数(default constructor)是指“可以不提供实参就调用”的构造函数,它允许有参数,只要这些参数都带有默认值。
为什么带默认参数的构造函数也算默认构造函数
关键在于调用方式,而非参数个数。只要编译器能推导出所有参数值(即每个参数都有默认值),ClassName() 或 new ClassName 这类无实参的写法就能合法通过。
-
MyClass() {}是默认构造函数(无参) -
MyClass(int x = 0, std::string s = "abc") {}也是默认构造函数(全默认) -
MyClass(int x, std::string s = "abc") {}不是——缺少x的默认值,MyClass()会编译失败
编译器隐式生成的默认构造函数一定无参
当类中没声明任何构造函数时,编译器生成的隐式默认构造函数一定是 ClassName() {} 形式,不带任何参数,也不含默认值。它只做最低限度初始化:调用基类和成员的默认构造函数(对内置类型如 int 不初始化)。
- 一旦你写了任意一个构造函数(哪怕带参数且无默认值),编译器就彻底放弃生成这个隐式版本
- 若此时你还想保留无参能力,必须显式写
ClassName() = default;或手写空体 - 隐式生成的版本无法被继承重用——派生类若需调用它,基类必须存在可访问的默认构造函数
多个“默认构造函数”共存会报错
C++禁止一个类同时拥有多个默认构造函数,因为调用时会产生歧义。
- 下面两段不能共存:
MyClass() {}和MyClass(int x = 0) {} - 编译器无法判断
MyClass obj;应该匹配哪一个 - 错误信息通常是:
error: ambiguous overload for 'operator='或更直接的error: call of overloaded 'MyClass()' is ambiguous - 解决办法:只保留一个,或用
=delete显式禁用不需要的
最容易被忽略的是:是否需要默认构造函数,往往不由你写的构造函数决定,而由容器、模板、继承链等外部上下文强制要求——比如 std::vector<myclass></myclass> 默认构造元素,MyClass 就必须有可访问的默认构造函数,哪怕你主观上认为“所有对象都应该带参数创建”。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











