Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 21, средняя оценка - 4.81
Neon-z
46 / 41 / 1
Регистрация: 06.09.2010
Сообщений: 419
#1

Оператор new - C++

04.09.2012, 20:23. Просмотров 2997. Ответов 26
Метки нет (Все метки)

Приветствую. Есть такой вопрос.
Почему одни программисты используют оператор new, а другие нет?
Ведь если создавать объект этими способами
C++
1
2
3
4
5
class test { /* code */ }
void test_function(){
      test varr; // 1 способ
      test varrr= new test(); // 2 способ
}
они оба корректны. Но чем они отличаются?

p>S. на java все надо создавать (массивы, объекты) через оператор new, а тут такой выбор. Объясните плиз нубу.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
novi4ok
550 / 503 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
04.09.2012, 22:30     Оператор new #21
Цитата Сообщение от lazybiz Посмотреть сообщение
Обычно (если не всегда) хэндл - это и есть указатель.
нет. указатель - это (по определению) адрес памяти, где находится то, на что указатель. а хэндл - это типа "пульта управления" от чего-то. это не обязательно адрес памяти. это может быть, например, индекс в таблице таких адресов, или индекс в таблице, где содержатся некие структуры, описывающие items, ... в общем, что угодно, позволяющее как-то работать с объектом.

Добавлено через 1 минуту
Цитата Сообщение от alex_x_x Посмотреть сообщение
ну int *pI = new int() гарантирует инициализацию нулем значения *pI
хотя явней конечно int *pI = new int(0);
даже не знаю, наверное, если ты так говоришь, то это так и есть . но это - слабый аргумент в пользу использования таких выкрутасов (ты ведь сам такое не делаешь?).

Добавлено через 4 минуты
Цитата Сообщение от Neon-z Посмотреть сообщение
Если честно, я с указателями скоко не боролся - так понять полностью не могу. Книг 10 использовал, искал где понятнее, на форумах спрашивал. Но так и не понял их. Мож я глупый, мож еще что то
попробуй почитать какую-нибудь простенькую книжку по языку ассемблера. каксаемо любого процессора. конечно, семейство 8080 предпочтительно, но не принципиально. книжку выбирая, полистай просто, имеются ли там картинки-графики, иллюстрирующие сущность регистров, стека, работу команд. просто полистай, почитай как роман, не стремись понять каждую козулю, посмотри эти картинки. и многое станет казаться проще.
castaway
Эксперт С++
4880 / 3016 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 10
Завершенные тесты: 1
04.09.2012, 22:41     Оператор new #22
Цитата Сообщение от novi4ok Посмотреть сообщение
нет
Да. Обычно это указатель на структуру/класс.

Цитата Сообщение от novi4ok Посмотреть сообщение
указатель - это (по определению) адрес памяти, где находится то, на что указатель.
Я знаю что такое указатель по-определению, и по сути.
По-определению, в языке С/С++ хэндла нет вообще.

Цитата Сообщение от novi4ok Посмотреть сообщение
это может быть, например, индекс в таблице таких адресов, или индекс в таблице
Я сказал "обычно" (хоть ни разу и не видел чтобы он использовался в качестве индекса).
Пример был бы кстати (хоть и не изменил бы мое мировоззрение на хэндлы).
Neon-z
46 / 41 / 1
Регистрация: 06.09.2010
Сообщений: 419
04.09.2012, 22:45  [ТС]     Оператор new #23
Спасибо
У нас целый курс был по арзитектуре процессора. Но как это привязать к указателям?
novi4ok
550 / 503 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
04.09.2012, 22:46     Оператор new #24
Цитата Сообщение от lazybiz Посмотреть сообщение
Я сказал "обычно" (хоть ни разу и не видел чтобы он использовался в качестве индекса).
Пример был бы кстати (хоть и не изменил бы мое мировоззрение на хэндлы).
handle - это парадигма такая. в каждом конкретном случае нужно смотреть конкретно, что имеется ввиду. в общем случае это - нечто стандартное, обеспечивающее определенный доступ к чему-то.
castaway
Эксперт С++
4880 / 3016 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 10
Завершенные тесты: 1
04.09.2012, 22:57     Оператор new #25
Это указатель. Парадигма тут не при чем. Индекс не логично называть хэндлом. Handle - это ручка (к примеру двери), что обычно связывают с указателем.
Toshkarik
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
04.09.2012, 23:13     Оператор new #26
Цитата Сообщение от novi4ok Посмотреть сообщение
даже не знаю, наверное, если ты так говоришь,
Явное указание конструктора по умолчанию для POD-типов, инициализирует их нулем. И тут не важно, знаете ли Вы, или нет. И это единственный способ инициализации массива нулями без цикла, который часто применяют.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.09.2012, 23:15     Оператор new
Еще ссылки по теме:

C++ Почему обращение к методам осуществляется через оператор прямого доступа, а не через оператор указателей->?
C++ В Delphi есть оператор cost i of. и т.д. Есть ли в C++ такой же оператор?
C++ Для чего нужен оператор двоеточие, если два двоеточия - это оператор расширения области видимости
C++ Как перегрузить оператор<< и оператор>> ?

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

Или воспользуйтесь поиском по форуму:
novi4ok
550 / 503 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
04.09.2012, 23:15     Оператор new #27
Цитата Сообщение от Neon-z Посмотреть сообщение
Спасибо
У нас целый курс был по арзитектуре процессора. Но как это привязать к указателям?
наговорю много слов.
если ты пишешь где-то глобально
C++
1
Item itm;
, у тебя в определенном сегменте памяти предусматривается участок, где будет находиться itm. сгенерируется код, инициализирующий эту единицу. все ссылки к этой переменной будут фактически ссылками к этому куску памяти. если это - внутри некой ф-ии:
C++
1
2
3
void foo(){
Item itm;
...
, то там, где будет обращение к этой ф-ии, компилятор сгенерирует код, который выполнит примерно следующее: запихает в стек "точку возврата" (т.е. запомнит, откуда мы вызываем ф-ю), запихнет в стек объект типа Item (фактически изменит значение регистра стека на величину памяти, занимаемой объектом, инициализирует объект, вызовет его конструктор и перейдет к выполнению ф-ии. при возврате вызовет деструктор, "выпихнет" объект из стека (т.е. просто изменит значение регистра стека на размер освобождаемой памяти), выберет из стека "точку возврата", и передаст туда управление (я не описал возврат значения, но это нам сейчас неинтересно).
заметь, память под объект выделялась и освобождалась арифметическими действиями с регистром стека, что является примитивной операцией.
если использовать указатель, то все происходит иначе. как только что выделялась память под объект (или в оеределенном сегменте памяти, или в стеке), теперь выделится память только под указатель на объект (4 байта в 32-bit система). значение ему не присвоится "автоматически", и никакой объект не создастся. его нужно будет создать "ручками" (оператором new, прямо или косвенно), и затем не забыть эту память освободить и желательно указателю значение null присвоить.
оператор new - это запрос на выделение памяти из heap'а, обращение к операционной системе, требующее времени.
казалось бы, "никогда никаких дел с укзаателями!". но очень часто (действительно очень) искользование указатеей облегчает жизнь.
устал, пошел спать...
Yandex
Объявления
04.09.2012, 23:15     Оператор new
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru