Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
4 / 4 / 0
Регистрация: 20.07.2018
Сообщений: 279

New для класса

14.06.2022, 11:54. Показов 1339. Ответов 20

Студворк — интернет-сервис помощи студентам
Здравствуйте, интересует такой вопрос: в чем отличие этих записей:
C++
1
Class cl;
И

C++
1
Class* cl = new Class();
Как я понимаю, в первом случае мы просто создаем объект, а во втором сами выделяем память под него. Есит ли какие то координальные отличия между этими двумя записями?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
14.06.2022, 11:54
Ответы с готовыми решениями:

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

Создание экземпляра класса-наследника для переменной с типом базового класса
Подскажите чайнику как создается экземпляр класса BC BaseClass BC = new DerivedClass(); Вопрос: BC - это экземпляр класса BaseClass...

Создать для класса виртуальный метод, возвращающий уникальный идентификатор класса
В курсаче по ООП сказано создать для класса виртуальный метод,возвращающий уникальный идентификатор класса. Вопрос в том, что это такое?

20
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
14.06.2022, 12:09
Цитата Сообщение от _lUserl_ Посмотреть сообщение
Есит ли какие то координальные отличия между этими двумя записями?
В первом случае память выделяется автоматически, а во втором - динамически. Когда память выделяется динамически, её нужно освобождать явным образом, в данном случае так: delete c1; В случае когда память выделяется автоматически, она так же освобождается автоматически. Думаю этого хватит для начала.
1
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38161 / 21096 / 4306
Регистрация: 12.02.2012
Сообщений: 34,683
Записей в блоге: 14
14.06.2022, 12:21
Есть и еще одно отличие: в первом случае для доступа к членам класса используется нотация "cl.*", а во втором - "cl->*"
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
14.06.2022, 12:45
Вопрос еще в том, где эти "записи".
0
Модератор
Эксперт CЭксперт С++
 Аватар для Volga_
5208 / 2925 / 1509
Регистрация: 14.12.2018
Сообщений: 5,266
Записей в блоге: 1
14.06.2022, 14:28
_lUserl_, и:

1.
Цитата Сообщение от _lUserl_ Посмотреть сообщение
Class cl;
cl - это локальная переменная с типом Class, и находится на стеке программы !

2.
Цитата Сообщение от _lUserl_ Посмотреть сообщение
Class* cl = new Class();
cl - это локальная переменная с типом Class*, и находится на стеке программы ! Но ее значение именно адрес зоны памяти на куче, размер которой равен размеру типа Class .
1
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
14.06.2022, 15:27
Цитата Сообщение от _lUserl_ Посмотреть сообщение
Как я понимаю, в первом случае мы просто создаем объект, а во втором сами выделяем память под него. Есит ли какие то координальные отличия между этими двумя записями?
1) Скорость. Без new память выделяется за константное время (или вообще нулевое, если это глобальная переменная). Через new - за хрен знает какое время.
2) Расходы памяти. Без new выделяется sizeof(Class) байт, плюс-минус несколько байт на выравнивание. Но память выделяется из стека, в котором по сегодняшним реалиям порядка нескольких мегабайт (а сколько точно - хрен его знает). Через new - выделяется не меньше sizeof(Class), а по факту может и вдвое больше (так быстрее "по техническим причинам"). Зато, нет вышеупомянутого лимита в несколько мегабайт.
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
14.06.2022, 16:32
Цитата Сообщение от _lUserl_ Посмотреть сообщение
Есит ли какие то координальные отличия между этими двумя записями?
Стек или куча: как "правильно" создавать объекты классов?
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
14.06.2022, 17:23
Цитата Сообщение от Renji Посмотреть сообщение
Без new выделяется sizeof(Class) байт, плюс-минус несколько байт на выравнивание. Но память выделяется из стека
Специально что бы не лезть во все эти стеки, аллокаторы и прочие сложные штуки не стал давать много информации, иначе придется сильно загрузить начинающего...

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

Ну что, опять ждем десять страниц? )
Так то против ничего не имею ))
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
14.06.2022, 17:43
Undisputed, либо в регистр либо в память (ОЗУ), о чем тут говорить вообще?
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
14.06.2022, 17:48
Сколько там этих регистров то, 128 если сильно повезет? В контексте переполнения стека, это капля в море. А в контексте ускорения выделения памяти - экономия одной операции смещения ESP. Плюс, при вызове вложенных функций содержимое регистров все равно будет сброшено в стек. А вот разница между временем создания массива на стеке и создания того же массива в куче уже существенна.
1
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
14.06.2022, 18:13

Не по теме:

Цитата Сообщение от _stanislav Посмотреть сообщение
о чем тут говорить вообще
Когда я писал про 10 страниц, то имел имел ввиду немного другое.
Иногда на этом форуме какой нибудь ТС задает вопрос, а в итоге тема переходит в бурное обсуждение того, что этот ТС не понимает. Ближе к середине про ТС все забывают и он куда-то исчезает :) Много раз тут такое видел и сам даже принимал участие))

Я к тому что работа с памятью это большая тема, а не просто new/delete это на стеке то в куче... вот к чему я упомянул про 10 страниц т.к вижу у людей желание подробно разобрать эту тему. Но как уже говорил, если кому интересно - то пожалуйста



Добавлено через 11 минут
Цитата Сообщение от Renji Посмотреть сообщение
Плюс, при вызове вложенных функций содержимое регистров все равно будет сброшено в стек.
Тоже ведь не факт, смотря что за функции...

_stanislav,
Видишь)) из одной цитаты уже несколько постов получилось, возможно будет продолжение, не знаю... )) А ты еще спрашивал говорил о чем тут говорить
1
14.06.2022, 18:36

Не по теме:

Цитата Сообщение от Undisputed Посмотреть сообщение
Видишь)) из одной цитаты уже несколько постов получилось, возможно будет продолжение, не знаю... ))
да но это уже реализация компилятора С++, и это уже точно не "С++ для начинающих".

0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
14.06.2022, 18:42
Цитата Сообщение от Undisputed Посмотреть сообщение
В первом случае память выделяется автоматически
не факт.

Цитата Сообщение от Volga_ Посмотреть сообщение
cl - это локальная переменная с типом Class, и находится на стеке программы !
не факт.


не забывайте про статический класс хранения.
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
14.06.2022, 18:44
Цитата Сообщение от hoggy Посмотреть сообщение
не забывайте про статический класс хранения.
у ТС-а нет слова static в коде.
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
14.06.2022, 18:54
Цитата Сообщение от _stanislav Посмотреть сообщение
да но это уже реализация компилятора С++, и это уже точно не "С++ для начинающих".
В любом случае это касается работы с памятью...

Цитата Сообщение от hoggy Посмотреть сообщение
не факт.
Понял тебя, но я немного о другом, а именно о том, что в любом случае при Class cl; мы не работаем с аллокатором напрямую
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
14.06.2022, 19:13
Цитата Сообщение от Undisputed Посмотреть сообщение
я немного о другом
в с++ слово "автоматический" - это термин.
использование терминов не по назначению - тернистый путь.

Цитата Сообщение от _stanislav Посмотреть сообщение
у ТС-а нет слова static в коде.
не принципиальный фактор.

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

можно так:

C++
1
2
static some obj;
int main(){}
можно так:

C++
1
2
some obj; // глобальный объект
int main(){}
можно так:

C++
1
2
3
4
5
6
7
8
// собственность ед. трансляции
namespace 
{
    some obj;
 
} // namespace
 
int main(){}
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
14.06.2022, 19:16
Цитата Сообщение от hoggy Посмотреть сообщение
либо в области видимости ед. трансляции, являются статическими.
сори, совсем забыл про глобалки
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
14.06.2022, 19:20
Цитата Сообщение от hoggy Посмотреть сообщение
в с++ слово "автоматический" - это термин
да, я согласен с этим утверждением, однако если быть до конца точным, то я нигде не говорил что "здесь мы получаем автоматический класс памяти" то сообщение было не про классы памяти, а про то что аллокатор трогать не нужно
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
14.06.2022, 19:46
Цитата Сообщение от Undisputed Посмотреть сообщение
сообщение было не про классы памяти
в том то и дело, что вопрос тс, и ответ на него именно что затрагивает классы памяти.

в первом случае - создание автоматического, либо статического объекта.
во-втором - создание динамического объекта.

Цитата Сообщение от _lUserl_ Посмотреть сообщение
координальные отличия
координально различаются, вестимо, координатами.

а вот кардинально - временем жизни:
- статический: до конца жизни процесса.
- автоматический: до конца своей области видимости.
- динамический: пока явным образом не будет запрошено удаление.
(не обязан помирать даже по факту завершения работы процесса)

зы:
в с++ есть ещё и thread_local: собственность отдельного треда.
объект живет столько, сколько живет породивший его поток.

а так же могут быть разного рода unspecified классы хранения.
например: брошенный эксепшен живет пока его кто нибудь не поймает,
либо все приложение не упадет от необработанного исключения.
где, при этом, все это время находится объект - этого язык не уточняет.
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
14.06.2022, 20:33
Цитата Сообщение от hoggy Посмотреть сообщение
в первом случае - создание автоматического, либо статического объекта.
А может вообще член класса.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
14.06.2022, 20:33
Помогаю со студенческими работами здесь

Создать объект класса Card как поле для класса Menu
Не могу создать объект класса Card как поле для класса Menu. Пробывал создавать объект класса Card в main, создавать внутри класса Menu...

Создание тестового класса (метода) для готового класса в Java
Может я чего-то не понимаю. Так вот.Припустим я создал готовый класс в Java,который выполняет какие-то действия.но его нужно...

Разрешить доступ к методу класса только для другого класса
Здравствуйте, нужно что бы у Item ссылка на Box была только для чтения, но при добавлении Item в Box у Box была возможность присвоить Item...

Перегрузка оператора >> для дочернего класса от базового виртуального класса
Доброго вам времени суток! Программирую на С++ не давно, в связи с отсутствием должного времени на поиск ответа в глубинах учебников,...

Реализовать свойства для класса. Все методы класса оставить без изменения
using System; usingSystem.Collections.Generic; usingSystem.Linq; usingSystem.Text; namespace Laba3 { classOdnomerniy_massiv ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru