Добрый день, подскажите, зачем делают указатель при объявлении объекта класса?
Вот пример - CDog* pDog = new CDog(); и CDog dog = CDog();
Какую они имеют разницу, кроме вызова функции с помощью -> и . ?
Другие языки программирования и технологии
[C++] Зачем делают указатель на класс?
При создании через new память выделяется в куче, иначе - в стеке
При выходе из текущего стекфрейма то, что создано в стеке, автоматически удалится
То есть, например, при выходе из функции созданный через new объект не удалится и останется доступен по тому адресу, куда указывает указатель
При выходе из текущего стекфрейма то, что создано в стеке, автоматически удалится
То есть, например, при выходе из функции созданный через new объект не удалится и останется доступен по тому адресу, куда указывает указатель
O'lmas Karimov
Рили изя?) Ответь, если не сложно. Смотрю тебя часто)))
Разница в том, что передавая собаку по ссылке в некоторый метод ты передаешь 8-16 байт. А когда ты это делаешь по значению, ты создаешь точную копию собаки и тащишь ее через стек со всеми блохами.
Ну и динамически выделяя память ты можешь создать хоть целую свору самых разных собак.
Ну и динамически выделяя память ты можешь создать хоть целую свору самых разных собак.
CDog dog = CDog();
это предпочтительнее в абсолютном большинстве случаев, чтобы не рисковать утечками и багами при ручном выделении памяти
только данная запись избыточна
достаточно так
CDog dog;
конструктор вызовется
это предпочтительнее в абсолютном большинстве случаев, чтобы не рисковать утечками и багами при ручном выделении памяти
только данная запись избыточна
достаточно так
CDog dog;
конструктор вызовется
O'lmas Karimov
на случай если аргументы конструктору класса буду писать) Привычка) спасибо за ответ!
Используйте динамическую память: CDog* pDog = new CDog(); , а не стек CDog dog;
Это практически очевидно в абсолютном большинстве случаев, с опытом понимание может и придёт.
Это практически очевидно в абсолютном большинстве случаев, с опытом понимание может и придёт.
p - Pointer - это ссылка на объект, позволяет взаимодействовать с ТЕМ САМЫМ объектом, на который ссылается
Безссылочная переменная же просто скопируется (и накакает в память, если это не стек):
pDog2 = pDog1
pDog2->kill() // умрет pDog1
Dog2 = Dog1
Dog2->kill() // Умрет только Dog2
Безссылочная переменная же просто скопируется (и накакает в память, если это не стек):
pDog2 = pDog1
pDog2->kill() // умрет pDog1
Dog2 = Dog1
Dog2->kill() // Умрет только Dog2
O'lmas Karimov
Спасибо!!!! Вот это и нужно было)
при указателе память выделяется один раз (в куче) и таскается только ссылка на этот кусок памяти.
Второй вариант - создание объекта в стеке. Если куда-то его передавать - будет создаваться копия (и оригинальный объект не будет модифицироваться при изменении копии)
Второй вариант - создание объекта в стеке. Если куда-то его передавать - будет создаваться копия (и оригинальный объект не будет модифицироваться при изменении копии)
O'lmas Karimov
А можно по-подробнее, в каких случаях какие объявления объекта нужно использовать? С указателями знаком недавно)
Драган Лазич
Не аргумент. Никто не мешает после
CDog dog = CDog();
взять указатель на dog и передавать только его?
и будет " и таскается только ссылка на этот кусок памяти. "
CDog dog = CDog();
взять указатель на dog и передавать только его?
и будет " и таскается только ссылка на этот кусок памяти. "
Михаил Кондратьев-Бондарев
Со стека тоже можно передавать по ссылке и указателю, но надо учитывать время жизни, а именно область видимости объекта. Причём объекта не только класса, а объекта в широком смысле, т. е. любые данные и даже функции (не зря существуют указатели на функции).
На самом деле хранилищ больше, чем статическое, автоматическое и динамическое. Есть потоковые, "константное", "функциональное" (эти термины "в кавычках" я сам выдумал, но не исключено, что они существуют).
На самом деле хранилищ больше, чем статическое, автоматическое и динамическое. Есть потоковые, "константное", "функциональное" (эти термины "в кавычках" я сам выдумал, но не исключено, что они существуют).
Похожие вопросы
- да зачем нужны эти указатели ?? C++. Зачем нужны указатели? почему не обойтись без простой переменной??
- Как в C# инициализировать массив в свойстве класса?
- c++: можно ли передать в класс адрес, описанного в нём элемента данных?
- C++ Что делает c_str()? Объясните начинающему программисту понятно и просто, пожалуйста.
- При компиляции программы вылетает Dev-C++. Что делать? И есть ли другие бесплатные, но годные её аналоги?
- с++. нужно для списков из библиотеки шаблонов перегрузить оператор==. делаю как в классах - хрен. подскажите, что-нибудь
- Как разыменовать указатель в C++
- C++: в чем принципиальная разница между использованием членов класса и указателей на них?
- Зачем в С/C++ создан отдельный тип "указатель"
- Когда стоит использовать указатели c++