Прежде всего, класс не может иметь двух конструкторов или функций с одинаковой сигнатурой (одно и то же имя и одинаковое число + тип параметров).
Случай 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;
}
Однако вам, вероятно, лучше в любом случае использовать векторы для этой цели ...