假设我在C ++中定义了一个类MyClass,并想创建一个包含100个此类对象的数组,即ArrayMyClass。
在此之前,可以说我声明了MyClass的单个对象,即
MyClass对象;
让我们考虑以下情况:
我试图弄清楚在什么情况下将声明该对象以及调用哪个构造函数。
我的理解是,对象上传递的参数类型决定了调用哪个构造函数。所以,
假设我声明了此类对象的数组,即
MyClass ArrayMyClass [100];
对于此声明,根据我的理解,对于仅声明一个对象的那8种情况,我有相同的推论。
我的理解在任何地方都不正确吗?在那些我不知道的情况下还会发生什么?
答案 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;
}
但是,无论如何,最好还是使用矢量来实现此目的...