Что на самом деле означает объявить указатель на объект в C ++? - PullRequest
0 голосов
/ 22 марта 2019

Это учебный вопрос:

Если я создал класс

class bank_account

И в основной функции я объявил

bank_account *pointer = new bank_account();

Тогда яинициализирующие переменные, такие как:содержит адрес переменной.Что это значит, если указатель объявлен как объект и что он на самом деле представляет?Указатель на объект ссылается на невидимый объект?

Ответы [ 3 ]

3 голосов
/ 22 марта 2019

, а указатель - это просто некоторая переменная, которая содержит адрес переменной

Исправление: указатель может указывать на любой объект;Не обязательно переменная.Переменные имеют имена.В динамическом хранилище могут быть объекты, имена которых не имеют непосредственных имен, например, подобъекты, временные объекты и объекты.

Например, в вашей программе выражение new bank_account() создает объект в динамическом хранилище.

Что это означает, если указатель объявлен как объект

Действительно неясно, что вы подразумеваете под "объявленным как объект" .Если вы объявляете указатель типа bank_account*, это означает, что он может указывать на объект типа bank_account, который является классом.

Если вы объявляете переменную, имеющую указательтипа, тогда объект, названный переменной, является указателем.

и что он на самом деле представляет?

Указатель представляет адрес объекта.Помимо того, что он содержит адрес объекта, он также может иметь нулевое значение указателя (которое указывает на отсутствие объекта) или может иметь недопустимое значение (адрес, который мог содержать объект, но этот объект больше не существует).

Затем я инициализирую переменные, такие как:

(*pointer).account_name ="Random Name";

Чтобы быть педантичным, это технически не инициализирует переменную.Инициализация выполняется для объектов при их создании.Эта переменная-член была создана ранее, и это выражение присваивает ей значение.Но если переменная ранее была неинициализирована, то в разговорной речи было бы совершенно неправильно говорить об инициализации.

, когда я объявляю объект как указатель, на что указывает указатель?

В вашем примере программы pointer указывает на объект, который был создан в динамическом хранилище, используя ключевое слово new.

Как правило, указатель указывает на некоторый объект, адрес которого хранится вуказатель или указатель могут вообще не указывать на объект (недопустимое или нулевое значение).


Вы сказали, что объект создан

Да,Выражение new создает объект в динамическом хранилище.

, но я объявил указатель

Да.Вы сделали.

, поэтому указатель указывает на объект?

Вы инициализировали значение указателя с результатом выражения new.Указатель указывает на объект, который был создан в динамическом хранилище.

и как тогда называется этот объект?

Объекты не имеют имен.Однако: у переменных есть имена, и переменные связаны с объектом, поэтому можно в разговорной речи сказать, что у этих объектов, связанных с переменной, есть имя.Но объекты в динамическом хранилище не именуются переменной.

1 голос
/ 22 марта 2019

указатель - это переменная, которая содержит адрес другой переменной. Любой указатель использует пространство в памяти, необходимое для сохранения адреса. на 64-битных платформах обычно требуется 8 байтов.

Когда вы создаете объект класса, он также находится в памяти и занимает столько байтов, сколько ему нужно. Указателю присваивается значение адреса этого объекта класса.

bank_account *pointer = new bank_account();

Выше объявляется указатель на объект типа bank_account. new выделяет место для объекта в памяти и возвращает его адрес. Он также вызывает конструктор класса. Адрес, возвращаемый new, присваивается переменной-указателю с именем pointer. Позже вы можете использовать его для доступа к объекту как

(*pointer).account_name ="Random Name";

или эквивалентно

pointer->account_name ="Random Name";

Указатель - это просто адрес. Тип указателя - это просто синтаксический сахар, который позволяет компилятору выполнять свою работу и предоставлять вам полезную информацию о вашей программе.

0 голосов
/ 22 марта 2019

Указатель - это переменная, которая содержит адрес памяти, и она существует везде, где она указывает на что-то, что имеет смысл или нет, то есть вы можете объявить этот указатель и не обязательно создавать экземпляр объекта, на который он указывает, он может простоуказать на nullptr, что обычно означает, что объект не существует в данный момент.Одно это полезно.Вы можете использовать его в качестве заполнителя или для отслеживания состояния программы.

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

Но самое важное свойство состоит в том, что объект, экземпляр которого вы new, не принадлежит этой конкретной области, если функция завершается, она не будет автоматически удалена.Этот объект может быть создан в подпрограмме и затем существовать в течение всей жизни программы или до тех пор, пока вы delete не сделаете это, и все, что вам нужно сделать, чтобы передать этот объект, - это передать его указатель, который представляет собой довольно небольшой фрагмент данных по сравнению счто-то глупое, как копирование объекта вокруг, это огромно для производительности.

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

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

...