将执行哪个构造函数?
Which constructor will be executed?
此处声明了参数化构造函数,但未创建与该构造函数对应的对象。但是输出的是10 20,这是参数化构造函数的执行,为什么?
#include<iostream>
using namespace std;
class constructor
{
int x, y;
public:
constructor(int a = 10, int b = 20 )
{
x = a;
y = b;
}
void Display()
{
cout<< x << " " << y << endl;
}
};
int main()
{
constructor objBix;
objBix.Display();
return 0;
}
引用 cppreference:
A default constructor is a constructor which can be called with no arguments (either defined with an empty parameter list, or with default arguments provided for every parameter).
如果没有提供其他构造函数,编译器只会为您隐式生成默认构造函数,因此在您的示例中不会生成它。
您确实定义了一个无参数构造函数,覆盖了默认构造函数。您为参数提供了默认值,因此您可以在不带参数的情况下调用它并使用您的默认值。
由于您已经使用 所有 个默认参数定义了自定义构造函数,因此它将作为默认构造函数。编译器不会生成另一个默认值,因为在决定调用哪个函数时会导致歧义。因此,实际调用的是使用了所有默认参数的自定义构造函数。编译器生成的 "default" 根本不存在。
参考:CppReference
A default constructor is a constructor which can be called with no arguments (either defined with an empty parameter list, or with default arguments provided for every parameter).
正如您在之前的答案中所读到的,因为您为参数提供了默认值,所以这是此 class 对象的默认构造函数。
所以就像写:
constructor()
{
x = a;
y = b;
}
这正是您所做的!
在这种情况下,已定义参数化构造函数,所有参数都具有一些默认值。因此,即使您创建一个对象而不传递任何参数,它也会将参数化构造函数视为默认构造函数并被调用。
例如,如果您将构造函数定义为
constructor(int a, int b = 20 )
{
x = a;
y = b;
}
然后您必须创建 class 的新对象,其中至少有一个值将分配给参数 "a"。
此处声明了参数化构造函数,但未创建与该构造函数对应的对象。但是输出的是10 20,这是参数化构造函数的执行,为什么?
#include<iostream>
using namespace std;
class constructor
{
int x, y;
public:
constructor(int a = 10, int b = 20 )
{
x = a;
y = b;
}
void Display()
{
cout<< x << " " << y << endl;
}
};
int main()
{
constructor objBix;
objBix.Display();
return 0;
}
引用 cppreference:
A default constructor is a constructor which can be called with no arguments (either defined with an empty parameter list, or with default arguments provided for every parameter).
如果没有提供其他构造函数,编译器只会为您隐式生成默认构造函数,因此在您的示例中不会生成它。
您确实定义了一个无参数构造函数,覆盖了默认构造函数。您为参数提供了默认值,因此您可以在不带参数的情况下调用它并使用您的默认值。
由于您已经使用 所有 个默认参数定义了自定义构造函数,因此它将作为默认构造函数。编译器不会生成另一个默认值,因为在决定调用哪个函数时会导致歧义。因此,实际调用的是使用了所有默认参数的自定义构造函数。编译器生成的 "default" 根本不存在。
参考:CppReference
A default constructor is a constructor which can be called with no arguments (either defined with an empty parameter list, or with default arguments provided for every parameter).
正如您在之前的答案中所读到的,因为您为参数提供了默认值,所以这是此 class 对象的默认构造函数。
所以就像写:
constructor()
{
x = a;
y = b;
}
这正是您所做的!
在这种情况下,已定义参数化构造函数,所有参数都具有一些默认值。因此,即使您创建一个对象而不传递任何参数,它也会将参数化构造函数视为默认构造函数并被调用。 例如,如果您将构造函数定义为
constructor(int a, int b = 20 )
{
x = a;
y = b;
}
然后您必须创建 class 的新对象,其中至少有一个值将分配给参数 "a"。