@Sasha294

Как понять: массив указателей на объекты классов?

Мне не понятно a* objects[10]; как оно работает

#include <iostream>
class a
{
        int i;
        public:
         a(int);  //конструктор копирования      
         void print(); //функция вывода на экран
};
 
a::a(int j): i(j) {  //инициализация через списки инициализации :) Как-то так
}
 
void a::print()
{
      std::cout<<this->i<<'\t'; 
}
int main()
{
     a* objects[10]; //массив указателей на объекты 
     for (int i=0; i<10; i++)
          {
             objects[i]=new a(i);   //создаем динамически объекты и присваиваем значения 
             objects[i]->print(); //выводим на экран
          }
     return 0;
}
  • Вопрос задан
  • 2433 просмотра
Пригласить эксперта
Ответы на вопрос 1
@Mercury13
Программист на «си с крестами» и не только
Вы тут просто не знаете, что такое указатель. А это, грубо говоря, адрес другого объекта в памяти.
Операция new заводит объект в «куче», вызывает конструктор (если таковой есть) и возвращает указатель на него.
И мы можем разыменовать указатель: пройти на тот объект, куда он указывает, и сделать с ним что-то. В Си разыменование — операция ->.

Указатели не на абстрактный класс, а на вполне конкретный, a.

a(int) — не конструктор копирования, а просто конструктор, делающий объект из int’а. Конструктор копирования всегда a(const a&). Отличается от других конструкторов тем, что автоматика его по возможности строит, но не всегда верно. В вашем объекте с одним полем int вполне себе построит без всяких проблем.

Обычный указатель Си никоим образом не знает, есть объект или нет, и кто этот объект уничтожает. У вас это приводит к ошибке «утечка памяти»: теряется указатель на объект, и уже никак его не освободишь. Из-за небольшого размера и линейного характера программы неопасно, но всё-таки.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы