Почему вам не нужны скобки при инициализации массива в списке инициализаторов элементов?

#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 нулями — когда дело доходит до инициализации, объявление уже было просмотрено. Этот порядок установлен правилами языка.