Классы. Динамически создаваемый одномерный массив c помощью методов класса

Классы дают замечательные возможности. Порождаемые от объектов классы могут представлять из себя очень разные сущности от обычного массива до очень сложных структур данных. Новички, пришедшие в С++ часто сталкиваются с проблемой перевыделения памяти массива. Обычные массивы, пришедшие и языка С, в С++ нерасширяемы, несужаемы. Они как бы есть и всё, какие есть, такие и есть. Но есть и указательные переменные, благодаря которым программист может оперировать участками памяти. В простейшей ситуации память выделяется один раз во время выполнения программы и перераспределить её можно путём выделения нового участка памяти, копирования туда информации из старого участка, зачистке старого участка и перенаправлением указателя на свежеиспечённое место. Это, впринципе, и при использовании классов так, но при использовании классов становится проще создавать объекты и использовать объекты, как если бы они были сами по себе динамическими массивами.
Динамический массив — это массив, который способен изменять свою вместимость элементов прямо по ходу работы программы. Т. е. такому массиву сказали, сколько элементов хотим в нём иметь, он столько и заимеет. Такие массивы достаточно удобны благодаря своей расширяемости. Примером показывается создание именно такого массива.

В параметрах метода Create используется ссылка на указатель. Поскольку указатель вообще ни разу не массив, а внутри функций без ссылки на указатель будет создана копии указательной переменной, пришедшей в параметр, без этого могут возникнуть проблемы при выполнении программы. Описание, когда можно и когда нельзя — выходит за рамки статьи. Для этого нужно понимать указатели, понимать отличие ссылочных параметров функций и обычных параметров. Суть в том, что может получиться копия указателя, которая внутри функции зародится и внутри функции и умрёт, как обычная локальная переменная функции.

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

Чтобы этого избежать и использовать указательную переменную извне функции, в некоторых случаях возможно использовать только ссылку на указательную переменную. В нашем случае указательная переменная используется напрямую, копии внутри функции не создаётся, поэтому всё работает хорошо.

Я не стал особо выпендриваться и поэтому выбрал простой одномерный массив и только стандартные методы для работы с ним. Если вы изучаете C++ и наткнулись на этот материал, то я искренне буду надеяться, что он оказался полезным, помог что-то понять и узнать новое.
Все комментарии на сайте проверяются, поэтому ваш комментарий может появиться не сразу. Для вставки кода в комментарий используйте теги: [php]ВАШ_КОД[/php]

5 комментариев: Классы. Динамически создаваемый одномерный массив c помощью методов класса

  • mnxoid говорит:

    P=NULL; //следуя правилам хорошего тона инициализируем его как пустой
    Я один здесь вижу утечку памяти? Вы выделяете память на int и обнуляете указатель, тем самым теряете доступ к участку памяти, выделенном при помощи new.
    Может вы имели ввиду *P=NULL ❓




    0



    0
  • Nik говорит:

    я все таки не могу понять, чем *&Arr отличается от []Arr. при чем тут вообще «*», «&», да еще и сразу?




    0



    0
    • admin говорит:

      []Arr == *Arr
      *Arr — создает локальную копию указателя на начало массива. Маленькая такая совсем, но все-таки дополнительная переменная, которая создается внутри функции локально и уничтожается внутри функции при выходе из нее.
      *&Arr — не создает локальную копию указателя на начало массива. Это ссылка на указатель. Работает по принципу "Функция, принимающая параметры по ссылке", т.е. напрямую с основным указателем на начало массива.
      Эффект должен стать заметен при большом количестве вызова функции.(не смотрел, но по идее так).




      0



      0
  • Аноним говорит:

    Что-то я совсе ничего не понял. Прошлый урок был понятен, а этот сразу начался с каких-то Arr. Хоть бы объяснили что это. Впервые вижу такой синтакстис




    0



    0
  • Дмитро говорит:

    Автору сайту — велике спасибі. Тема дійсно для початківців, і цей приклад у своєму роді відмінний.
    Так він не ідеальний але це приклад і привід знайти помилки і самому написати краще. Всім хто критикують прохання самим писати приклади.




    0



    0

Добавить комментарий

Ваш e-mail не будет опубликован.

9 + 1 =

Поиск

 
     

Случайная книга в электронном формате

https://www.litres.ru/stanislav-gornakov/razrabotka-komputernyh-igr-dlya-pristavki-xbox-360-v-xna-game-studio-express/?lfrom=15589587
Яндекс.Метрика
НАГРАДИ АВТОРА САЙТА
WEBMONEY
R375024497470
U251140483387
Z301246203264
E149319127674

-Папа, а что такое "высшее образование"? -Это то, что в 80-х годах прошлого века называлось "среднее"..

Выражаю свою признательность

  • Максиму очень признателен за указание на мои ошибки и неточности.
  • Sergio ===> за оказание помощи в исправлении моих ошибок
  • Gen ===> за правильное стремление помочь другим новичкам и выявления моих ошибок