时间:2018-12-05 03:58:18

标签: c++ arrays oop default-constructor

假设我在C ++中定义了一个类MyClass,并想创建一个包含100个此类对象的数组,即ArrayMyClass。

在此之前,可以说我声明了MyClass的单​​个对象,即

MyClass对象;

让我们考虑以下情况:

  1. MyClass只有默认的构造函数
  2. MyClass只有一个非默认构造函数,没有默认参数
  3. MyClass只有具有默认参数的非默认构造函数
  4. MyClass具有默认和非默认构造函数,但后者没有默认参数
  5. MyClass具有默认和非默认构造函数,但后者具有默认参数
  6. MyClass具有2个非默认构造函数,其中一个具有默认构造函数,另一个没有默认参数
  7. MyClass有一个默认的构造函数,还有两个非默认的构造函数,一个带有默认参数,另一个没有默认参数。
  8. MyClass尚未定义构造函数。

我试图弄清楚在什么情况下将声明该对象以及调用哪个构造函数。

我的理解是,对象上传递的参数类型决定了调用哪个构造函数。所以,

  1. 在情况1中,如果未传递任何参数,则应声明对象。如果传递了参数,则会引发错误。
  2. 在情况2中,仅当我传递正确类型的参数时,才应声明对象。如果我没有传递任何参数或传递了错误的类型/数量的参数,它将引发错误。
  3. 如果我传递正确的类型/数量的参数,但如果我没有传递参数,也应该声明对象。仅当参数的类型/数量不正确时,它才会引发错误。
  4. 如果未传递任何参数,则将调用默认构造函数。如果传递了正确的参数,则会调用非默认构造函数。
  5. 如果我传递正确的参数,则会调用非默认构造函数。当您不传递任何参数时,我会感到困惑。
  6. 在这种情况下,如果我不传递任何参数,则应调用具有默认参数的非默认构造函数。我不确定传递参数时会发生什么。是不是一个类不能有两个具有相同类型/数量参数的构造函数?
  7. 这个案例看起来与案例5类似,我也感到困惑。
  8. 在这种情况下,如果未传递任何参数,则假定C ++提供了内置的裸机构造函数。但是,如果我传递参数,则会引发错误。

假设我声明了此类对象的数组,即

MyClass ArrayMyClass [100];

对于此声明,根据我的理解,对于仅声明一个对象的那8种情况,我有相同的推论。

我的理解在任何地方都不正确吗?在那些我不知道的情况下还会发生什么?

1 个答案:

答案 0 :(得分:1)

首先,一个类不能具有两个具有相同签名(相同名称和相同编号+参数类型)的构造函数或函数。

情况1-4:您对情况1-4的假设是正确的。

情况5:关于情况5的第一部分假设也是正确的。关于您不传递任何参数时会发生什么的问题,您将得到“重载的YOURCLASSNAME()的调用不明确。请看以下代码:

#include <iostream>
using namespace std;

class Box {
    public:
    int height, width, depth;
    Box() {}

    Box(int h=2, int w=3, int d=4) {
        height=h;
        width=w;
        depth=d;
    }
};

int main()
{
    Box b;
    return 0;
}

此代码生成error: call of overloaded 'Box()' is ambiguous,并且构建失败。

情况6。如前所述,一个类不能有两个具有相同签名的构造函数。因此,代码将无法构建。以下代码将无法正确编译。

#include <iostream>
using namespace std;

class Box {
    public:
    int height, width, depth;
    Box(int h, int w, int d) {
        height=h;
        width=w;
        depth=d;
    }

    Box(int h=2, int w=3, int d=4) {
        height=h;
        width=w;
        depth=d;
    }
};

int main()
{
    Box b;
    return 0;
}

将生成以下错误消息error: 'Box::Box(int, int, int)' cannot be overloaded

案例7 。您不能有两个具有相同签名的构造函数。如果您有一个默认构造函数和一个带有默认参数的非默认构造函数,并尝试在不传递任何参数的情况下创建对象,则您将得到对重载的构造函数的歧义错误,如情况5所示。

案例8。您的假设是正确的

当您尝试创建对象数组时,将应用相同的规则。如果要创建没有默认构造函数的类Box的数组,则可以像以下代码那样进行:

#include <iostream>
using namespace std;

class Box {
    public:
    int height, width, depth;

    Box(int h, int w, int d) {
        height=h;
        width=w;
        depth=d;
    }
};

int main()
{
    Box box(1,3,2);
    Box b[5] = box;

    for(int i=0; i<5; i++) {
        cout << b[i].height << ' ' << b[i].width << ' ' << b[i].depth << endl;
    }

    return 0;
}

但是,无论如何,最好还是使用矢量来实现此目的...