Армянское Радио: Спасибо, что сказали, у меня и правда в голове была каша. Перечитал Страуструпа. Теперь я понял, что когда мы резервируем массив отчет ведется от единицы, но элементы индексируются с нуля.
int a[3];
a[0] это 1
a[1] это 2
a[2] это 3
Извините, а можно спросить, я похоже заблуждался все это время.
Сейчас у меня два варианта насчет массивов.
1: при объявлении массива резервируется столько ячеек сколько объявлено вместе с нулевой. То есть int arr[2] это 0 1 2 и ячейка два завершающая. Где arr[0] это 0 arr[1] это 1 arr[2] это 2.
2: при объявлении массива резервируется столько ячеек сколько объявлено, причем счет ведется с 0ой. То есть int arr[2] это 0 1,
где arr[0] это 1 и arr[1] это 2.
Какой из этих вариантов правильный?
Ну хорошо, но ведь и в массивах последняя ячейка завершающая- ноль?
Например
int arr[5]{0, 1, 2, 3, 4};
К arr[5] мы обратиться не можем. Вот это я и назвал завершающим символом.
Теперь мне понятно, что строка сама по себе несет завершающий символ, и его нужно было учесть.
Но и в этом случае char example[4], example[4] являлся завершающей ячейкой.
Ну не обязательно все так. Можно вызвать деструктор явно для объекта размещенного в стеке. А потом вполне себе спокойно снова использовать объект.
Например:
MyClass object;
// ...
object.~MyClass();