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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 21, средняя оценка - 4.81
Neon-z
46 / 41 / 1
Регистрация: 06.09.2010
Сообщений: 419
04.09.2012, 20:23     Оператор new #1
Приветствую. Есть такой вопрос.
Почему одни программисты используют оператор 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, а тут такой выбор. Объясните плиз нубу.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.09.2012, 20:23     Оператор new
Посмотрите здесь:

C++ Написать программу, содержащую оператор оператор for для счета от 2 до 5 через 1
Условный оператор, оператор ввода/вывода; плоскость и принадлежность точки C++
Применяя оператор цикла FOR вычислить y. Оператор if в теле цикла не использовать. Значение m и n вводить с клавиатуры. C++
C++ Оператор break как оператор go to next
C++ Почему обращение к методам осуществляется через оператор прямого доступа, а не через оператор указателей->?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Петррр
 Аватар для Петррр
5917 / 3354 / 333
Регистрация: 28.10.2010
Сообщений: 5,926
04.09.2012, 20:29     Оператор new #2
Думаю что всем кто пишет на C++ приходится использовать new. new используется для динамического создания объектов, и вы сможете удалить в любое время. В Java есть сборщик мусора поэтому там не приходится думать о памяти.
Invader_Zim
Twilight Parasite
 Аватар для Invader_Zim
153 / 149 / 2
Регистрация: 21.07.2011
Сообщений: 907
04.09.2012, 20:33     Оператор new #3
Neon-z, это немного не корректно. Корректней будет так:

C++
1
2
3
4
5
6
class test { /* code */ }
void test_function(){
      test *varrr= new test(); // 2 способ
//т.к. потом без вопросов делается delete
delete varrr; 
}
Neon-z
46 / 41 / 1
Регистрация: 06.09.2010
Сообщений: 419
04.09.2012, 20:40  [ТС]     Оператор new #4
Invader_Zim, а почему надо указатель?
Без указателя же тоже прекрасно работает
Invader_Zim
Twilight Parasite
 Аватар для Invader_Zim
153 / 149 / 2
Регистрация: 21.07.2011
Сообщений: 907
04.09.2012, 20:41     Оператор new #5
Neon-z, а статический объект разрушается делитом?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
04.09.2012, 20:41     Оператор new #6
Neon-z, Без указателя это не работает. Вот как раз почитайте в книжке про оператор new и все вопросы отпадут. http://liveworkspace.org/code/2bd237...386be64df8b4c2
Петррр
 Аватар для Петррр
5917 / 3354 / 333
Регистрация: 28.10.2010
Сообщений: 5,926
04.09.2012, 20:42     Оператор new #7
Neon-z, не может быть:
VS 2010: error C2440: 'initializing' : cannot convert from 'test *' to 'test'
Neon-z
46 / 41 / 1
Регистрация: 06.09.2010
Сообщений: 419
04.09.2012, 20:43  [ТС]     Оператор new #8
Спасибо. Буду разбираться.
Герц
523 / 340 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
04.09.2012, 20:51     Оператор new #9
C++ можно сказать уникален в возможности создавать объекты на стеке, а не в куче (с использованием new), и этим стоит пользоваться везде где удается.
Без указателя же тоже прекрасно работает
C++
1
void* operator new( size_t );
вот сигнатура оператора new, возвращается указатель, так что сомнительно, что у тебя все прекрасно работает :-)
Neon-z
46 / 41 / 1
Регистрация: 06.09.2010
Сообщений: 419
04.09.2012, 21:03  [ТС]     Оператор new #10
Может я в свое время что то не так делал) я про указатель не помню, чтобы я его ставил, но все работало и даже как надо
Может сейчас путаница в голове из-за параллельного изучения java.
Герц
523 / 340 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
04.09.2012, 21:07     Оператор new #11
Скорее всего, в Java все выглядело бы именно так.
Java
1
new test()
Причем именно так, а не
C++
1
new test
Java без скобочек не разрешает.
Neon-z
46 / 41 / 1
Регистрация: 06.09.2010
Сообщений: 419
04.09.2012, 21:09  [ТС]     Оператор new #12
В java используется неявлное использование указателей, то есть код
Java
1
 Test_Class object = new Test_Class()
уже подразумевает, что object является указателем на память.
Герц
523 / 340 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
04.09.2012, 21:11     Оператор new #13
Корректнее сказать, что используются ссылки. Имхо.
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
04.09.2012, 21:17     Оператор new #14
Цитата Сообщение от Neon-z Посмотреть сообщение
В java используется неявлное использование указателей, то есть код
Java
1
 Test_Class object = new Test_Class()
уже подразумевает, что object является указателем на память.
не указателем, а handle'ом. далеко не одно и то же.

возьмем твой пример (подправленный):

C++
1
2
3
4
5
class test { /* code */ }
void test_function(){
      test varr; // 1 способ
      test *pVar= new test(); // 2 способ
}
у тебя в обоих случаях будет создан объеат класса test. разница в том, что в первом случае он будет создан в стеке (stack), во стором - в "куче" (heap).
в первом случае тебе не нужно заботиться об освобождении памяти, занимаемой объектом, во втором - нужно. иначе он там буде висеть, пока процесс не завершится.
продолжать? что такое stack и что такое heap? или сам почитаешь и разберешься? лучше сперва почитай, и если что неясно - спроси. народ подсадит.
Neon-z
46 / 41 / 1
Регистрация: 06.09.2010
Сообщений: 419
04.09.2012, 21:19  [ТС]     Оператор new #15
novi4ok, твой ответ по-моему самый ясный для меня Что такое стек и куча я знаю.
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
04.09.2012, 21:41     Оператор new #16
я видел даже такой код (два раза!):
C++
1
2
int *pI = new int();
...
спрашивал человека (первого. он был студент. второй был школьник, он еще, возможно, разберется, не спрашивал), зачем это так. толком объяснить не сумел, но мне показалось, он хотел показать (кому? себе, наверное), что он с указателями на короткой ноге.
Invader_Zim
Twilight Parasite
 Аватар для Invader_Zim
153 / 149 / 2
Регистрация: 21.07.2011
Сообщений: 907
04.09.2012, 21:43     Оператор new #17
novi4ok, такой пример в википедии есть, вот люди и страдают фигней
Neon-z
46 / 41 / 1
Регистрация: 06.09.2010
Сообщений: 419
04.09.2012, 21:56  [ТС]     Оператор new #18
Если честно, я с указателями скоко не боролся - так понять полностью не могу. Книг 10 использовал, искал где понятнее, на форумах спрашивал. Но так и не понял их. Мож я глупый, мож еще что то
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
04.09.2012, 22:06     Оператор new #19
Цитата Сообщение от novi4ok Посмотреть сообщение
int *pI = new int();
ну int *pI = new int() гарантирует инициализацию нулем значения *pI
хотя явней конечно int *pI = new int(0);
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.09.2012, 22:10     Оператор new
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
04.09.2012, 22:10     Оператор new #20
Цитата Сообщение от novi4ok Посмотреть сообщение
не указателем, а handle'ом. далеко не одно и то же
Обычно (если не всегда) хэндл - это и есть указатель.
Yandex
Объявления
04.09.2012, 22:10     Оператор new
Ответ Создать тему
Опции темы

Текущее время: 07:35. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru