C++参数化构造函数参数设默认值与未设置的运行逻辑差异
原理说明
初始代码可以正常运行的核心原因是:你定义的带全默认参数的构造函数,本身就可以作为默认构造函数使用,相关规则如下:
- C++中的默认构造函数,指的是不需要传入任何参数就能完成调用的构造函数,只要一个构造函数满足「所有参数都有默认实参」,就符合默认构造函数的要求。
你代码里的Complex(int r=0, int i=0)构造函数,所有参数都设置了默认值,当你写Complex c3;这条语句时,编译器会自动填入默认的r=0、i=0来调用这个构造函数完成c3的初始化,因此不会报错。
移除默认参数后报错的原因
当你把参数的默认值删除后,这个构造函数变成了Complex(int r, int i),必须传入两个int参数才能调用,此时你的类中不存在任何可以无参调用的构造函数:
- C++编译器只会在你没有定义任何自定义构造函数的时候,自动生成一个无参的默认构造函数。一旦你自定义了任意构造函数,编译器就不会再自动生成无参构造函数。
此时你写Complex c3;要调用无参构造函数时,编译器找不到匹配的函数,就会抛出你看到的「no matching function for call to ‘Complex::Complex()’」错误。
内容的提问来源于stack exchange,提问作者user2791843
相关产品推荐
相关产品推荐

