将执行哪个构造函数?

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"。