2015-02-11 4 views
2

Я новичок в C++, мне нужно некоторые разъяснения о конструкторе и мой вопрос здесь:Почему параметризованный конструктор нельзя вызвать при создании массива объектов класса?

  1. Можно ли использовать параметризованный конструктор при создании массива объектов класса?
  2. Или можно использовать конструктор по умолчанию при создании массива объектов класса?

Пожалуйста, объясните, как это можно сделать, или почему это невозможно. Мне нужно более глубокое понимание этого.

ответ

6

Вы можете использовать параметризованный конструктор для инициализации массива. См. Следующий пример.

class Foo 
{ 
public: 
    Foo(int _a, bool _b) : a{_a}, b{_b} {} 
private: 
    int a; 
    bool b; 
}; 

int main() { 
    Foo things[] = {{5, true}, 
        {3, false}, 
        {7, true}}; 
    return 0; 
} 

Массив things имеет Foo объектов. Я использую единую инициализацию для построения объектов 3 Foo в массиве. Они полагаются на параметризованный конструктор, который я определил в классе.

+0

Действительно благодарю вас за объяснение @Cyber ​​ – Nagarajan

+0

Так же мы можем создать многомерный объект массива? – Nagarajan

+1

@ Nagarajan Да, у вас будет только один вложенный уровень '{}' – CoryKramer

4

Да, это возможно, хотя в C++ 03 есть некоторые ограничения. Это справедливо:

A a[3] = { x, y, z }; 

Но называть Конструкторам принимают несколько аргументов, что нужно сделать что-то вроде:

A a[3] = { A(x1, x2, x3), A(y1, y2, y3), A(z1, z2, z3) }; 

В C++ 11 это проще благодаря новому единому синтаксису инициализации:

A a[3] = { {x1, x2, x3}, {y1, y2, y3}, {z1, z2, z3} }; 
+2

Для первого и второго синтаксиса требуется конструктор копирования, поэтому убедитесь, что объект скопирован, а конструктор копирования правильно реализован. – user3528438

2

Допустим, у нас есть этот класс:

class Foo 
{ 
public: 
    Foo(int i, const std::string& s); 
    // ... 
}; 

Тогда

  1. Да:

    std::vector<Foo> myFooVector(5, Foo(1, "bar")); 
    

    выше создает vector из пяти Foo объектов, каждый из которых имеет аргументы 1 и "bar" отправлены на e параметризованный конструктор.

    Вы также можете использовать массив, например, например.

    std::array<Foo, 2> myFooArray = { 
        { 1, "bar" }, 
        { 2, "quug" } 
    }; 
    

    выше создает array, содержащие два Foo объектов, каждый строится с помощью параметризованного конструктора.

  2. Если вы явно не вызываете какой-либо конструктор, будет использоваться конструктор по умолчанию. Используя примеры из выше:

    std::vector<Foo> myFooVector(5); 
    

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

    И

    std::array<Foo, 2> myFooArray; 
    

    Это создает массив из двух стандартных построенных Foo объектов.

+1

Дополнительные точки коричневого цвета, если вы упомянете о преимуществах 'Foo', имеющих конструктор перемещения. – Bathsheba

+0

Благодарим вас за разъяснение @Joachim – Nagarajan

Смежные вопросы