首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当(非)默认构造函数被定义(不)时,声明类的对象数组?

当(非)默认构造函数被定义(不)时,声明类的对象数组?
EN

Stack Overflow用户
提问于 2018-12-05 03:58:18
回答 1查看 107关注 0票数 0

假设我在C++、MyClass中定义了一个类,并希望创建一个由100个这样的对象组成的数组,即ArrayMyClass。

在此之前,假设我声明了MyClass的单个对象,即

MyClass Obj;

让我们来看看下面的例子:

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

我正在试图找出在哪些情况下对象将被声明,哪些构造函数将被调用。

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

  1. 在情况1中,如果没有传递参数,则应声明object。如果传递参数,则会引发错误。
  2. 在第2种情况下,只有在传递正确类型的参数时,对象才会被声明。如果不传递任何参数,或者传递错误的参数类型/数量,则会引发错误。
  3. 对象应该被声明,如果我传递正确的参数类型/数量,如果不传递参数,也应该声明。只有当参数的类型/数目不正确时,才会引发错误。
  4. 如果没有传递参数,则调用默认构造函数。如果传递正确的参数,则调用非默认构造函数。
  5. 在这种情况下,当我传递正确的参数时,将调用非默认构造函数。我搞不懂当你不传递参数时会发生什么。
  6. 在这种情况下,如果不传递参数,则应该调用具有默认参数的非默认构造函数。我不知道当你传递参数时会发生什么。类不能有两个具有相同类型/数量的参数的构造函数吗?
  7. 这个案例看起来类似于案例5,我也有同样的困惑。
  8. 在这种情况下,如果没有传递参数,我假设C++提供了内置的基本构造函数。但是如果我传递参数,它会抛出一个错误。

假设我声明了这样一个对象的数组,即

MyClass ArrayMyClass100;

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

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

EN

回答 1

Stack Overflow用户

发布于 2018-12-05 05:30:16

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

案例1-4:你对案例1-4的假设是正确的.

案例5:关于案例5的第一部分假设也是正确的。至于不传递参数时会发生什么的问题,您将得到“重载的YOURCLASSNAME()的调用是不明确的。

代码语言:javascript
运行
复制
#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.正如我以前说过的,类不能有两个具有相同签名的构造函数。因此,代码将无法构建。以下代码将无法正确编译。

代码语言:javascript
运行
复制
#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数组,您可以这样做,如下代码所示:

代码语言:javascript
运行
复制
#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;
}

但是,无论如何,你最好还是用向量来实现这个目的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53624967

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档