Объявление массива объектов класса, когда (не) конструктор по умолчанию (не) определен? - PullRequest
0 голосов
/ 05 декабря 2018

Предположим, что я определяю класс в C ++, MyClass и хочу создать массив из 100 таких объектов, например, ArrayMyClass.

Перед этим, скажем, я объявляю один объект MyClass, то есть

MyClass Obj;

Давайте рассмотрим следующие случаи:

  1. MyClass имеет только конструктор по умолчанию
  2. MyClass имеет только конструктор не по умолчанию, но не по умолчаниюпараметры
  3. MyClass имеет только конструктор не по умолчанию с параметрами по умолчанию
  4. MyClass имеет конструктор по умолчанию и не по умолчанию, но последний не имеет параметров по умолчанию
  5. MyClass имеети конструктор по умолчанию и не по умолчанию, но последний имеет параметры по умолчанию
  6. MyClass имеет 2 конструктора не по умолчанию, один из них имеет параметры по умолчанию, а другой не имеет параметров по умолчанию
  7. MyClass имеетконструктор по умолчанию и два конструктора не по умолчанию, один с параметрами по умолчанию, а другой не имеет параметров по умолчанию.
  8. MyClass не имеет constrопределены векторы.

Я пытаюсь выяснить, в каких случаях будет объявлен объект и какой конструктор будет вызван.

Насколько я понимаю, тип параметров, передаваемых вобъект решает, какой конструктор будет вызван.Итак,

  1. В случае 1 объект должен быть объявлен, если не переданы никакие параметры.Если параметры передаются, он должен выдавать ошибку.
  2. В случае 2 объект должен быть объявлен, только если я передам правильный тип параметров.Он должен выдавать ошибку, если я не передаю какие-либо параметры или если я передаю неправильный тип / количество параметров.
  3. Объект должен быть объявлен, если я передаю правильный тип / количество параметров, но также еслиЯ не передаю никаких параметров.Она выдаст ошибку только в том случае, если тип / количество параметров неверны.
  4. Если параметры не переданы, вызывается конструктор по умолчанию.Если передаются правильные параметры, вызывается конструктор не по умолчанию.
  5. В случае, когда я передаю правильные параметры, вызывается конструктор не по умолчанию.Я запутался, что происходит, когда вы не передаете никаких параметров.
  6. В этом случае, если я не передам никаких параметров, должен быть вызван конструктор не по умолчанию с параметрами по умолчанию.Я не уверен, что происходит, когда вы передаете параметры.Неужели класс не может иметь 2 конструкторов с одинаковым типом / числом параметров?
  7. Этот случай похож на случай 5, и у меня такая же путаница.
  8. В этом случае, если нетпараметры передаются, я предполагаю, что C ++ предоставляет встроенный конструктор.Но если я передам параметры, это вызовет ошибку.

Предположим, я объявляю массив таких объектов, т.е.

MyClass ArrayMyClass [100];

Для этогоДекларация, исходя из моего понимания, я делаю те же выводы для тех 8 случаев, которые я имею при объявлении только одного объекта.

Мое понимание где-либо неверно?И что происходит в тех случаях, которые я не мог понять?

1 Ответ

0 голосов
/ 05 декабря 2018

Прежде всего, класс не может иметь двух конструкторов или функций с одинаковой сигнатурой (одно и то же имя и одинаковое число + тип параметров).

Случай 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;
}

Однако вам, вероятно, лучше в любом случае использовать векторы для этой цели ...

...