#c #arrays #class #initialization #class-constructors
#c #массивы #класс #инициализация #конструкторы классов
Вопрос:
Например, у меня есть:
#include <iostream>
class Foo {
private:
int size;
int arr[10];
public:
Foo();
};
Foo::Foo()
: size {0}, arr { } {
}
int main() {
Foo one;
}
Это работает, но если бы я попытался использовать скобки:
#include <iostream>
class Foo {
private:
int size;
int arr[10];
public:
Foo();
};
Foo::Foo()
: size {0}, arr[] { } { // error
}
int main() {
Foo one;
}
Почему вам не нужны скобки при инициализации массива в списке инициализаторов элементов? Это просто синтаксис? Встречается ли такое поведение при инициализации массивов где-либо еще?
Комментарии:
1. И почему вы думаете, что они нужны?
2. Потому что именно так вы инициализируете массивы вне списков элементов конструктора. Насколько мне известно, вы не присваиваете / не инициализируете какое-либо значение массивам без использования скобок. Единственное место, где я мог думать о том, чтобы ссылаться на массивы без скобок, — это когда вы передаете их функции @Evg
3. Квадратные скобки используются для объявления массива (как в
int arr[10];
), а также для доступа к элементам массива (например,int elem = arr[7];
). Хотя инициализация часто выполняется в той же строке, что и объявление (например,int arr[3] = {1, 2, 3};
или простоint arr[]{1, 2, 3};
), это две разные концепции. Квадратные скобки не связаны с инициализацией.4. Когда вы пишете
arr{}
в списке инициализаторов элементов, это означает, что все элементы массива будут инициализированы нулями. Количество элементов в массиве уже известно из вашего объявленияint arr[10];
: это означает, что массивarr
состоит из десяти элементов. Количество элементов в массиве (в стиле C) фиксировано, оно не может измениться. Если вам нужны динамические массивы, которые могут расти и позволяют вставлять дополнительные элементы, используйтеstd::vector
вместо массива в стиле C.5. Вы не можете инициализировать необъявленный массив. Сначала компилятор видит объявление
int arr[10];
, затем он инициализирует его 10 нулями — когда дело доходит до инициализации, объявление уже было просмотрено. Этот порядок установлен правилами языка.