Другие языки программирования и технологии

[C++] Зачем делают указатель на класс?

Добрый день, подскажите, зачем делают указатель при объявлении объекта класса?
Вот пример - CDog* pDog = new CDog(); и CDog dog = CDog();
Какую они имеют разницу, кроме вызова функции с помощью -> и . ?
O'lmas Karimov
O'lmas Karimov
94
При создании через new память выделяется в куче, иначе - в стеке
При выходе из текущего стекфрейма то, что создано в стеке, автоматически удалится
То есть, например, при выходе из функции созданный через new объект не удалится и останется доступен по тому адресу, куда указывает указатель
Айбек Райимбеков
Айбек Райимбеков
7 845
Лучший ответ
O'lmas Karimov Рили изя?) Ответь, если не сложно. Смотрю тебя часто)))
Разница в том, что передавая собаку по ссылке в некоторый метод ты передаешь 8-16 байт. А когда ты это делаешь по значению, ты создаешь точную копию собаки и тащишь ее через стек со всеми блохами.
Ну и динамически выделяя память ты можешь создать хоть целую свору самых разных собак.
Виктор Есин
Виктор Есин
87 928
CDog dog = CDog();
это предпочтительнее в абсолютном большинстве случаев, чтобы не рисковать утечками и багами при ручном выделении памяти
только данная запись избыточна
достаточно так
CDog dog;
конструктор вызовется
DC
Dima Cudlenco
92 464
O'lmas Karimov на случай если аргументы конструктору класса буду писать) Привычка) спасибо за ответ!
Используйте динамическую память: CDog* pDog = new CDog(); , а не стек CDog dog;
Это практически очевидно в абсолютном большинстве случаев, с опытом понимание может и придёт.
ДЛ
Драган Лазич
27 070
p - Pointer - это ссылка на объект, позволяет взаимодействовать с ТЕМ САМЫМ объектом, на который ссылается
Безссылочная переменная же просто скопируется (и накакает в память, если это не стек):

pDog2 = pDog1
pDog2->kill() // умрет pDog1

Dog2 = Dog1
Dog2->kill() // Умрет только Dog2
***рафаэль ***
***рафаэль ***
23 106
O'lmas Karimov Спасибо!!!! Вот это и нужно было)
при указателе память выделяется один раз (в куче) и таскается только ссылка на этот кусок памяти.
Второй вариант - создание объекта в стеке. Если куда-то его передавать - будет создаваться копия (и оригинальный объект не будет модифицироваться при изменении копии)
O'lmas Karimov А можно по-подробнее, в каких случаях какие объявления объекта нужно использовать? С указателями знаком недавно)
Драган Лазич Не аргумент. Никто не мешает после
CDog dog = CDog();
взять указатель на dog и передавать только его?
и будет " и таскается только ссылка на этот кусок памяти. "
Михаил Кондратьев-Бондарев Со стека тоже можно передавать по ссылке и указателю, но надо учитывать время жизни, а именно область видимости объекта. Причём объекта не только класса, а объекта в широком смысле, т. е. любые данные и даже функции (не зря существуют указатели на функции).
На самом деле хранилищ больше, чем статическое, автоматическое и динамическое. Есть потоковые, "константное", "функциональное" (эти термины "в кавычках" я сам выдумал, но не исключено, что они существуют).