Во-первых, если мне нужен массив stati c с 10 элементами, правильный ли следующий способ?
Да, это правильный путь.
Некоторые люди предпочитают заключать массив в шаблон класса, такой как std::array
.
Во-вторых, если я хочу динамический массив c, какое из следующих утверждений является правильным? Если ни один из них, я был бы признателен, если бы вы объяснили причину и правильный путь.
class A {
public:
int arr[];
};
Это неверно сформулированное заявление. Элемент не может быть массивом неопределенной длины.
class A {
public:
int *arr;
};
Это верно как таковое, но не создан динамический c массив. Использование этого для владения динамическим c массивом - плохой дизайн, потому что голые указатели никогда не должны иметь владельца.
Даже для указания массива, хранящегося в другом месте, это проблематично c, так как класс не знает о длине массива.
Это был бы правильный путь, предполагая, что массив принадлежит классу:
class A {
public:
std::vector<int> arr;
};
Если массив не принадлежит классу, то правильное следующее :
class A {
public:
std::span<int> arr;
};
std::span
не входит в стандарт до C ++ 20, поэтому до тех пор вам нужно прибегнуть к нестандартной реализации.
Наконец , что произойдет, если я инициализирую свойство в определении класса следующим образом
class A {
public:
int arr[] = {1,2,3};
Это неправильно сформировано, поскольку размер члена не может быть определен из инициализатора.
int *arr = new int[5];
new int[5]
- инициализатор элемента по умолчанию. В противном случае он будет использоваться, если для члена не предоставлен инициализатор.