将执行哪个构造函数?

时间:2018-01-07 15:10:58

标签: c++ constructor default-constructor parameterized-constructor

此处,声明了参数化构造函数,但未创建与该构造函数对应的对象。但输出是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;
}

5 个答案:

答案 0 :(得分:3)

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

参考:CppReference

  

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

答案 1 :(得分:1)

引用cppreference

  

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

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

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

答案 4 :(得分:-1)

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

所以它就像写:

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

这正是你所做的!