为什么我不能在 C++ 中一次初始化 3 个默认参数

why cant i initialize 3 default parameters at a time in c++

class Complex 
{
private:

float rp, ip;
//const int a=10;
//static int b;
//static const int c = 50;
public:
Complex();
//Complex(float );
/*Complex(float,float);*/
Complex(float , float = 20, float = 30);
} 

上面的代码工作正常,但是当我尝试使用 3 个默认参数时

class Complex
{
private:
float rp, ip;
//const int a=10;//static int b;//static const int c = 50;
public:
Complex();
//Complex(float );
/*Complex(float,float);*/
Complex(float =10  , float = 20, float = 30);
} 

我收到以下错误 -

main.cpp(12): error C2668: 'Complex::Complex' : ambiguous call to
overloaded function complex.h(15): could be 'Complex::Complex(float,float,float)' complex.h(12): or 'Complex::Complex(void)'

具有三个默认参数的构造函数与您的无参数构造函数冲突。

构造函数不明确。如果您构造不带参数的Complex,编译器无法理解您要调用的构造函数:它是否是默认构造函数

Complex();

或者三个参数的构造函数都默认:

Complex(float =10  , float = 20, float = 30);

如果你这样做,这两个构造函数都会匹配

Complex c;

new Complex();

错误信息说得很清楚。

问题是因为所有 3 个参数都是默认的,所以编译器不知道如何推断出您在谈论什么函数重载。

// default constructor, or 3 defaulted floats?
Complex a;

这会失败,因为编译器无法知道您在编写时指的是两个不同的函数中的哪一个

Complex c;

那个叫

Complex();

Complex(float,float,float);

使用三个默认值?

您可以通过删除 Complex() 构造函数来解决此问题,并让具有三个默认值的 Complex(float,float,float) 构造函数处理默认构造。