-1

Вопрос такой, зачем и что значит указатель типа собственный объект/класс?

class A{
};

A* ptrA;

И что я могу делать с этим указателем? Не судите строго я новичок))

insolor
  • 49,104

1 Answers1

1

В вашем примере сделать практически ничего нельзя, так как класс пустой. Можно только его инициализировать, но толку от этого нет. Для примера создадим в классе один публичный метод и одно публичное поле.

class A{
public:
    int i;
    int f(){
        return i;
    }
};

Пусть у нас есть указатель на тип A:

A *ptrA;

Пока он не инициализирован, поэтому обращаться к нему нельзя. Но его можно инициализировать. Например, с помощью вновь созданного оператором new объекта:

ptrA = new A;

Теперь ptrA содержит валидный объект класса A, и можно обращаться ко всем его открытым членам:

int i1 = ptrA->i;
int i2 = ptrA->f();

Если объект больше не нужен, его можно удалить:

delete ptrA;

Оператор delete вызывает деструктор класса и освобождает занятую им память. После этого указатель становится недействительным. К членам класса A по указателю ptrA обращаться больше нельзя.

Инициализировать этот указатель можно и иначе. Допустим, у нас уже есть где-то созданный объект класса A. Тогда можно инициализировать этот указатель адресом этого объекта:

A a;
A *ptrA = &a;

Здесь ptrA указывает на объект a. К его членам можно обращаться как с помощью переменной a и оператора "точка", так и с помощью переменной ptrA и оператора "стрелка".

maestro
  • 4,735
  • 1
    *ptrA - псевдоним объекта а. Но ptrA -другой объект – Swift - Friday Pie Dec 27 '22 at 12:57
  • 1
    "После этого указатель снова становится неинициализированным" - так говорить нельзя. Указатель нельзя "разинициализировать". После delete указатель сохранит своё значение. Стандарт запрещает его разыменовывать и только. – Stanislav Volodarskiy Dec 27 '22 at 13:00
  • @Swift-FridayPie, спасибо за уточнения, исправил. – maestro Dec 28 '22 at 02:35
  • 1
    @StanislavVolodarskiy, После delete указатель сохранит своё значение. — так тоже говорить нельзя. :) После высвобождения памяти все указатели на любой байт освобождённой памяти изменяют своё значение на invalid pointer value (basic.stc.general/4). Разыменование и повторная деаллокация невалидного указателя вызывают UB. А вот прочие действия над ним являются implementation-defined behavior. Особенно веселит, что по мнению стандарта простое копирование невалидного указателя может порушить программу: – wololo Dec 28 '22 at 21:47
  • 1
    ... Some implementations might define that copying an invalid pointer value causes a system-generated runtime fault. Если по старому адресу снова будет выделена память и там будет жить объект, старый указатель не станет вновь валидным. Т.е. два побайтово равных указателя запросто могут хранить разные значения. На практике с современными оптимизирующими компиляторами это может приводить к тяжелейшим последствиям. Ну а vc++ и вовсе умеет явно портить указатель после delete. – wololo Dec 28 '22 at 21:48