假设我在C++、MyClass中定义了一个类,并希望创建一个由100个这样的对象组成的数组,即ArrayMyClass。
在此之前,假设我声明了MyClass的单个对象,即
MyClass Obj;
让我们来看看下面的例子:
我正在试图找出在哪些情况下对象将被声明,哪些构造函数将被调用。
我的理解是,传递给对象的参数类型决定了调用哪个构造函数。所以,
假设我声明了这样一个对象的数组,即
MyClass ArrayMyClass100;
对于这个声明,根据我的理解,对于这8种情况,我有与声明一个对象相同的推论。
我的理解在任何地方都不正确吗?还有,在那些我不知道的情况下会发生什么呢?
发布于 2018-12-05 05:30:16
首先,类不能有两个具有相同签名(相同的名称和相同的参数number+type )的构造函数或函数。
案例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;
}但是,无论如何,你最好还是用向量来实现这个目的。
https://stackoverflow.com/questions/53624967
复制相似问题