编译器默认构造函数规则存疑:移除自定义构造函数后为何报错?
为什么移除自定义默认构造后编译器没生成默认构造?
嘿,这个问题其实戳中了C++默认构造函数规则里很容易踩坑的细节——很多人只记住了“未定义任何构造函数时,编译器会提供默认构造函数”这句话,但往往忽略了它的核心前提:编译器只会在你的类完全没有显式定义任何构造函数的情况下,才会自动生成默认构造函数。
问题出在哪?
我猜你的complex类里,除了你写的那个`complex(){}默认构造函数之外,应该还定义了其他构造函数——比如用来初始化实部和虚部的带参构造函数,类似这样:
class complex { private: int real; int imag; public: // 带参构造函数 complex(int r, int i) : real(r), imag(i) {} // 你之前写的默认构造 // complex(){} // 加法重载等其他成员函数... };
当你显式定义了任何构造函数(不管是带参的、拷贝构造还是移动构造),编译器就会认为:你已经自己处理了对象的初始化逻辑,不需要它再生成默认构造函数了。这时候如果你移除自己写的complex(){},然后在main里写complex C;`,编译器就会找不到合适的默认构造函数,自然会报错。
验证一下规则
如果你的complex类里完全没有任何构造函数——既没有默认构造,也没有带参构造,比如:
class complex { private: int real; int imag; public: // 只有加法重载等成员函数,没有任何构造函数 complex operator+(const complex& other) { complex res; res.real = this->real + other.real; res.imag = this->imag + other.imag; return res; } };
这时候编译器才会自动为你生成一个平凡的默认构造函数,你在main里写complex C;就能正常编译了(不过要注意:这个自动生成的默认构造不会初始化内置类型的成员变量,real和imag的值会是随机的)。
总结一下完整规则
记住这句话的准确表述:
当且仅当一个类没有显式定义任何构造函数时,编译器才会自动生成一个默认构造函数。
只要你定义了任意一种构造函数,编译器就会放弃生成默认构造,这时候如果需要无参初始化,你就得自己显式定义默认构造函数。
内容的提问来源于stack exchange,提问作者Bhart Kumar
相关产品推荐
相关产品推荐

