将执行哪个构造函数

Which constructor will be executed?

本文关键字:构造函数 执行      更新时间:2023-10-16

在这里,声明了一个参数化的构造函数,但不会创建与该构造函数对应的对象。但是输出是 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;
}

由于您已经定义了具有所有默认参数的自定义构造函数,因此它将用作默认构造函数。编译器不会生成另一个默认函数,因为这会在决定调用哪个函数时产生歧义。因此,实际调用的是使用所有默认参数的自定义构造函数。编译器生成的"默认值"根本不存在。

参考:CPP首选项

默认构造函数

是可以在没有参数的情况下调用的构造函数(使用空参数列表定义,或使用为每个参数提供的默认参数定义(。

引用 cpp 首选项:

默认构造函数

是可以在没有参数的情况下调用的构造函数(使用空参数列表定义,或使用为每个参数提供的默认参数定义(。

如果没有提供其他构造函数,编译器只会为您隐式生成默认构造函数,因此在您的示例中不会生成它。

您确实定义了一个 no-arg 构造函数,覆盖了默认构造函数。您为参数提供了默认值,因此您可以在没有参数的情况下调用它,并使用默认值。

在本例中,参数化构造函数已定义,所有参数都具有一些默认值。因此,即使您在不传递任何参数的情况下创建一个对象,它也会将参数化构造函数视为默认构造函数并被调用。例如,如果将构造函数定义为

constructor(int a, int b = 20 )
{
    x = a;
    y = b;
}

然后,您必须创建具有至少一个值的类的新对象,该值将被分配给参数"a"。

正如

您在前面的答案中读到的那样,由于您为参数提供了默认值,因此这是此类对象的默认构造函数。

所以就像写:

constructor()
{
    x = a; 
    y = b;
}

这正是你所做的!