2013-03-14 2 views
2

Привет, я новичок в обучении C++, и у меня есть быстрый вопрос.Создание массивов в C++

Если я создаю массив, содержащий 5 структур, я должен очистить массив, как показано ниже при построении, или оставить его как при объявлении его.

другими словами делает что-то вроде

person a[5]; 

for(int i = 0; i < 5; i++) 
{ 
    a[i].name= ""; 
    a[i].value= 0; 
} 

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

person[5]; 
+0

'человек [5]' является шестой позиция FYI – 2013-03-14 16:39:59

+1

это действительно зависит от деталей самой структуры. И то, чего вы хотите достичь, конечно. – juanchopanza

ответ

2

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

Но вместо того, чтобы инициализировать его в петле, то лучше определить конструктор по умолчанию, который будет инициализировать элементы данных экземпляра person, когда он построен:

struct person 
{ 
    person() : value(0) { } 

    std::string name; 
    int value; 
} 

А также отметить, что использование STL контейнеры, такие как std::vector гораздо лучше, чем при использовании идеи
массивов C-стиле :)

+0

«Ваша структура - тип POD» - нет, это не так, а не с 'std :: string' внутри ayway. И вам не нужно инициализировать строку с пустым "", у нее есть конструктор по умолчанию, который делает это – 2013-03-14 16:46:46

+0

Вы не можете сказать, что это POD, не зная, каковы типы его членов. – juanchopanza

+0

@juanchopanza, aleguna: Отредактировано. – LihO

3

Нет, вы этого не сделаете. Вам нужен правильный конструктор по умолчанию для person

+0

Конечно, это имеет следствием рендеринга 'person' неагрегата. Это не может быть проблемой, но стоит упомянуть. Кроме того, в зависимости от типов элементов данных, пользовательский конструктор по умолчанию может не понадобиться. – juanchopanza

2

Есть ли причины, по которым вы не можете использовать vector? Это они C++, и будет намного проще и реже иметь ошибки. Вот пример:

#include <vector> 

std::vector<person> a ; 

a.push_back(person(...)) ; 

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

class person 
{ 
    public: 
    person() : value(0) {...} // default constructor 
}; 
+0

Возможно, им нужен фиксированный размер, совокупная структура. – juanchopanza

+0

@juanchopanza Я порекомендовал упомянуть по умолчанию ctor, если им нужно было использовать массивы –

3

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

В общем, вы, вероятно, предпочтете вместо этого использовать std::vector<person>, но вы не дали достаточного контекста, чтобы сказать наверняка.


конструктор по умолчанию будет выглядеть примерно так: (обратите внимание, что std::string имеет свой собственный конструктор по умолчанию, так что нам не нужно ничего делать для этого)

struct person { 
    std::string name; 
    int value; 

    person() : value(0) {} 
}; 

Теперь это:

person a[5]; 

правильно инициализирован без дополнительных усилий.


Если вы планируете инициализировать элементы «правильно» позже в любом случае, а затем с помощью вектора делает его легче пропустить неиспользуемого фиктивный инициализации:

struct person { 
    std::string name; 
    int value; 

    person() : value(0) {} 
    person(std::string const &n, int v) : name(n), value(v) {} 
}; 

std::vector<person> people; 
people.reserve(5); 
// just create each person with the right values in the first place: 
for (int i = 0; i < 5; ++i) { 
    people.push_back(person(get_name(i), get_value(i))); 
} 

Наконец, если вы не против иметь неинициализированную память, ваша первая версия (без конструктора и без цикла) в порядке. Тем не менее, обратите внимание, что потеря отслеживания того, какие элементы/члены действительны и которые являются мусором, является плодородным источником ошибок.

2

Как уже упоминалось выше человека [5] является шестой позиции

В C++ не используют массив и вместо того, чтобы использовать векторы

0

На первой строке, где вы объявляете свой массив, конструктор по умолчанию person будет вызываться 5 раз (один раз на элемент вашего массива). Если ваш конструктор person инициализирует элементы name и value на разумные значения, вам не нужно использовать ваш цикл.

0

Нет, они не то же самое.

В первом примере:

person a[5]; 

Вы объявляете массив длины 5, типа человека.

Однако это:

person[5] 

Это не действует - не имя переменной, ничего не будет назначен, ничего, что вы можете перебрать позже.

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