0

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

5 回答 5

3

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

参考:Cpp参考

默认构造函数是可以不带参数调用的构造函数(使用空参数列表定义,或者为每个参数提供默认参数)。

于 2018-01-07T15:15:45.077 回答
1

引用cppreference

默认构造函数是可以不带参数调用的构造函数(使用空参数列表定义,或为每个参数提供默认参数)。

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

于 2018-01-07T15:14:25.763 回答
0

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

于 2018-01-07T15:14:55.627 回答
0

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

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

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

于 2018-01-07T16:04:20.767 回答
-1

正如您在之前的答案中所读到的,因为您为参数提供了默认值,所以这是此类对象的默认构造函数。

所以就像写:

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

这正是你所做的!

于 2018-01-07T15:40:03.580 回答