默认构造函数的参数有关问题
默认构造函数的参数问题
编译报错 error C2512: “A”: 没有合适的默认构造函数可用。
但如果将构造函数的入参由
这是哪条规则?
为什么入参赋默认值之后,就认为是和无参数的默认构造函数一样了?
------解决方案--------------------
可能是A(int x =0){},参数是可选参数,与默认的构造函数A(){}功能相似,从而不报错了,
------解决方案--------------------
默认构造函数就是不带形参或者所有形参都提供默认实参的构造函数,你提供了默认实参,所以不报错了。
------解决方案--------------------
当有显式自定义构造函数的时候编译器就会放弃生成默认构造函数。你定义了A(int x)就意味着没有了自动生成的A(void),所以不能用无参形式的对象定义
------解决方案--------------------
为什么入参赋默认值之后,就认为是和无参数的默认构造函数一样了。 也不是完全如你那么说。比如
这样就是不行的。归根到底,并不是认为是和无参数的默认构造函数一样了, 只是函数的形式类似而已
class A
{
public:
A(int x){}
};
int _tmain(int argc, _TCHAR* argv[])
{
A one;
return 0;
}
编译报错 error C2512: “A”: 没有合适的默认构造函数可用。
但如果将构造函数的入参由
int x修改改为
int x=0就可以编译通过。
这是哪条规则?
为什么入参赋默认值之后,就认为是和无参数的默认构造函数一样了?
------解决方案--------------------
可能是A(int x =0){},参数是可选参数,与默认的构造函数A(){}功能相似,从而不报错了,
------解决方案--------------------
默认构造函数就是不带形参或者所有形参都提供默认实参的构造函数,你提供了默认实参,所以不报错了。
------解决方案--------------------
当有显式自定义构造函数的时候编译器就会放弃生成默认构造函数。你定义了A(int x)就意味着没有了自动生成的A(void),所以不能用无参形式的对象定义
------解决方案--------------------
为什么入参赋默认值之后,就认为是和无参数的默认构造函数一样了。 也不是完全如你那么说。比如
class A
{
public:
A(int x, int y = 1){}
};
int _tmain(int argc, _TCHAR* argv[])
{
A one;
return 0;
}
这样就是不行的。归根到底,并不是认为是和无参数的默认构造函数一样了, 只是函数的形式类似而已