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

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

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

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

04.09.2012, 20:23. Просмотров 3340. Ответов 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, а тут такой выбор. Объясните плиз нубу.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.09.2012, 20:23
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Оператор new (C++):

Условный оператор, оператор ввода/вывода; плоскость и принадлежность точки - C++
Здравствуйте. В С++ я абсолютный новичок, поэтому с первым же заданием возникли определённые трудности. Будьте добры, помогите решить. Буду...

Написать программу, содержащую оператор оператор for для счета от 2 до 5 через 1 - C++
В С++ я ноль, помогите пожалуйста написать прогу Написать программу, содержащую оператор оператор for для счета от 2 до 5 через 1 ...

Для шаблонного класса перегрузить оператор присваивания, copy-конструктор, объекты cin и cout, оператор * - C++
Помогите в следующем: Для класса шаблона следует перегрузить оператор присваивания, конструктор копирования, бинарный оператор суммы «*»,...

Для чего нужен оператор двоеточие, если два двоеточия - это оператор расширения области видимости - C++
для чего нужен оператор двоеточие ( : ), если два двоеточия( :: ) - это оператор расширения области видимости.

Почему обращение к методам осуществляется через оператор прямого доступа, а не через оператор указателей->? - C++
#include <iostream> using namespace std; class random { public: void Set(int b){a=b;} int Get(){return a;} private: ...

Применяя оператор цикла FOR вычислить y. Оператор if в теле цикла не использовать. Значение m и n вводить с клавиатуры. - C++
Применяя оператор цикла FOR вычислить y. Оператор if в теле цикла не использовать. Значение m и n вводить с клавиатуры. Шаг изменения...

26
novi4ok
551 / 504 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
04.09.2012, 21:41 #16
я видел даже такой код (два раза!):
C++
1
2
int *pI = new int();
...
спрашивал человека (первого. он был студент. второй был школьник, он еще, возможно, разберется, не спрашивал), зачем это так. толком объяснить не сумел, но мне показалось, он хотел показать (кому? себе, наверное), что он с указателями на короткой ноге.
1
Invader_Zim
Twilight Parasite
153 / 149 / 2
Регистрация: 21.07.2011
Сообщений: 908
04.09.2012, 21:43 #17
novi4ok, такой пример в википедии есть, вот люди и страдают фигней
1
Neon-z
46 / 41 / 1
Регистрация: 06.09.2010
Сообщений: 419
04.09.2012, 21:56  [ТС] #18
Если честно, я с указателями скоко не боролся - так понять полностью не могу. Книг 10 использовал, искал где понятнее, на форумах спрашивал. Но так и не понял их. Мож я глупый, мож еще что то
0
alex_x_x
бжни
2449 / 1654 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
04.09.2012, 22:06 #19
Цитата Сообщение от novi4ok Посмотреть сообщение
int *pI = new int();
ну int *pI = new int() гарантирует инициализацию нулем значения *pI
хотя явней конечно int *pI = new int(0);
1
castaway
Эксперт С++
4885 / 3020 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
04.09.2012, 22:10 #20
Цитата Сообщение от novi4ok Посмотреть сообщение
не указателем, а handle'ом. далеко не одно и то же
Обычно (если не всегда) хэндл - это и есть указатель.
1
novi4ok
551 / 504 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
04.09.2012, 22:30 #21
Цитата Сообщение от lazybiz Посмотреть сообщение
Обычно (если не всегда) хэндл - это и есть указатель.
нет. указатель - это (по определению) адрес памяти, где находится то, на что указатель. а хэндл - это типа "пульта управления" от чего-то. это не обязательно адрес памяти. это может быть, например, индекс в таблице таких адресов, или индекс в таблице, где содержатся некие структуры, описывающие items, ... в общем, что угодно, позволяющее как-то работать с объектом.

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

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

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

Цитата Сообщение от novi4ok Посмотреть сообщение
это может быть, например, индекс в таблице таких адресов, или индекс в таблице
Я сказал "обычно" (хоть ни разу и не видел чтобы он использовался в качестве индекса).
Пример был бы кстати (хоть и не изменил бы мое мировоззрение на хэндлы).
1
Neon-z
46 / 41 / 1
Регистрация: 06.09.2010
Сообщений: 419
04.09.2012, 22:45  [ТС] #23
Спасибо
У нас целый курс был по арзитектуре процессора. Но как это привязать к указателям?
0
novi4ok
551 / 504 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
04.09.2012, 22:46 #24
Цитата Сообщение от lazybiz Посмотреть сообщение
Я сказал "обычно" (хоть ни разу и не видел чтобы он использовался в качестве индекса).
Пример был бы кстати (хоть и не изменил бы мое мировоззрение на хэндлы).
handle - это парадигма такая. в каждом конкретном случае нужно смотреть конкретно, что имеется ввиду. в общем случае это - нечто стандартное, обеспечивающее определенный доступ к чему-то.
1
castaway
Эксперт С++
4885 / 3020 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
04.09.2012, 22:57 #25
Это указатель. Парадигма тут не при чем. Индекс не логично называть хэндлом. Handle - это ручка (к примеру двери), что обычно связывают с указателем.
0
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,386
Завершенные тесты: 1
04.09.2012, 23:13 #26
Цитата Сообщение от novi4ok Посмотреть сообщение
даже не знаю, наверное, если ты так говоришь,
Явное указание конструктора по умолчанию для POD-типов, инициализирует их нулем. И тут не важно, знаете ли Вы, или нет. И это единственный способ инициализации массива нулями без цикла, который часто применяют.
0
novi4ok
551 / 504 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
04.09.2012, 23:15 #27
Цитата Сообщение от Neon-z Посмотреть сообщение
Спасибо
У нас целый курс был по арзитектуре процессора. Но как это привязать к указателям?
наговорю много слов.
если ты пишешь где-то глобально
C++
1
Item itm;
, у тебя в определенном сегменте памяти предусматривается участок, где будет находиться itm. сгенерируется код, инициализирующий эту единицу. все ссылки к этой переменной будут фактически ссылками к этому куску памяти. если это - внутри некой ф-ии:
C++
1
2
3
void foo(){
Item itm;
...
, то там, где будет обращение к этой ф-ии, компилятор сгенерирует код, который выполнит примерно следующее: запихает в стек "точку возврата" (т.е. запомнит, откуда мы вызываем ф-ю), запихнет в стек объект типа Item (фактически изменит значение регистра стека на величину памяти, занимаемой объектом, инициализирует объект, вызовет его конструктор и перейдет к выполнению ф-ии. при возврате вызовет деструктор, "выпихнет" объект из стека (т.е. просто изменит значение регистра стека на размер освобождаемой памяти), выберет из стека "точку возврата", и передаст туда управление (я не описал возврат значения, но это нам сейчас неинтересно).
заметь, память под объект выделялась и освобождалась арифметическими действиями с регистром стека, что является примитивной операцией.
если использовать указатель, то все происходит иначе. как только что выделялась память под объект (или в оеределенном сегменте памяти, или в стеке), теперь выделится память только под указатель на объект (4 байта в 32-bit система). значение ему не присвоится "автоматически", и никакой объект не создастся. его нужно будет создать "ручками" (оператором new, прямо или косвенно), и затем не забыть эту память освободить и желательно указателю значение null присвоить.
оператор new - это запрос на выделение памяти из heap'а, обращение к операционной системе, требующее времени.
казалось бы, "никогда никаких дел с укзаателями!". но очень часто (действительно очень) искользование указатеей облегчает жизнь.
устал, пошел спать...
0
04.09.2012, 23:15
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.09.2012, 23:15
Привет! Вот еще темы с ответами:

Оператор break как оператор go to next - C++
Подскажите, в этом примере break эквивалентна действию оператора go to next?

Как перегрузить оператор<< и оператор>> ? - C++
Доброго времени суток. Застрял на двух вопросах и не как не могу найти инфу которвя мне помогла бы их решить. вопрос первый. В общем...

В Delphi есть оператор cost i of. и т.д. Есть ли в C++ такой же оператор? - C++
(C++ Builder XE5)

Оператор if - C++
Почему у меня оператор Else выдает как ошибку(Е2054 Misplaced else)? и в операторе if не нравится как я записал if((s==a)&amp;&amp;(f==p)); ? ...


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

Или воспользуйтесь поиском по форуму:
27
Ответ Создать тему
Опции темы

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