Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.93/27: Рейтинг темы: голосов - 27, средняя оценка - 4.93
49 / 44 / 8
Регистрация: 06.09.2010
Сообщений: 419
1

Оператор new

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

Author24 — интернет-сервис помощи студентам
Приветствую. Есть такой вопрос.
Почему одни программисты используют оператор 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.09.2012, 20:23
Ответы с готовыми решениями:

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

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

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

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

26
6280 / 3565 / 898
Регистрация: 28.10.2010
Сообщений: 5,926
04.09.2012, 20:29 2
Думаю что всем кто пишет на C++ приходится использовать new. new используется для динамического создания объектов, и вы сможете удалить в любое время. В Java есть сборщик мусора поэтому там не приходится думать о памяти.
1
Twilight Parasite
154 / 150 / 7
Регистрация: 21.07.2011
Сообщений: 908
04.09.2012, 20:33 3
Neon-z, это немного не корректно. Корректней будет так:

C++
1
2
3
4
5
6
class test { /* code */ }
void test_function(){
      test *varrr= new test(); // 2 способ
//т.к. потом без вопросов делается delete
delete varrr; 
}
1
49 / 44 / 8
Регистрация: 06.09.2010
Сообщений: 419
04.09.2012, 20:40  [ТС] 4
Invader_Zim, а почему надо указатель?
Без указателя же тоже прекрасно работает
0
Twilight Parasite
154 / 150 / 7
Регистрация: 21.07.2011
Сообщений: 908
04.09.2012, 20:41 5
Neon-z, а статический объект разрушается делитом?
1
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
04.09.2012, 20:41 6
Neon-z, Без указателя это не работает. Вот как раз почитайте в книжке про оператор new и все вопросы отпадут. http://liveworkspace.org/code/... e64df8b4c2
1
6280 / 3565 / 898
Регистрация: 28.10.2010
Сообщений: 5,926
04.09.2012, 20:42 7
Neon-z, не может быть:
VS 2010: error C2440: 'initializing' : cannot convert from 'test *' to 'test'
1
49 / 44 / 8
Регистрация: 06.09.2010
Сообщений: 419
04.09.2012, 20:43  [ТС] 8
Спасибо. Буду разбираться.
0
545 / 344 / 12
Регистрация: 05.11.2010
Сообщений: 1,076
Записей в блоге: 1
04.09.2012, 20:51 9
C++ можно сказать уникален в возможности создавать объекты на стеке, а не в куче (с использованием new), и этим стоит пользоваться везде где удается.
Без указателя же тоже прекрасно работает
C++
1
void* operator new( size_t );
вот сигнатура оператора new, возвращается указатель, так что сомнительно, что у тебя все прекрасно работает :-)
1
49 / 44 / 8
Регистрация: 06.09.2010
Сообщений: 419
04.09.2012, 21:03  [ТС] 10
Может я в свое время что то не так делал) я про указатель не помню, чтобы я его ставил, но все работало и даже как надо
Может сейчас путаница в голове из-за параллельного изучения java.
0
545 / 344 / 12
Регистрация: 05.11.2010
Сообщений: 1,076
Записей в блоге: 1
04.09.2012, 21:07 11
Скорее всего, в Java все выглядело бы именно так.
Java
1
new test()
Причем именно так, а не
C++
1
new test
Java без скобочек не разрешает.
1
49 / 44 / 8
Регистрация: 06.09.2010
Сообщений: 419
04.09.2012, 21:09  [ТС] 12
В java используется неявлное использование указателей, то есть код
Java
1
 Test_Class object = new Test_Class()
уже подразумевает, что object является указателем на память.
0
545 / 344 / 12
Регистрация: 05.11.2010
Сообщений: 1,076
Записей в блоге: 1
04.09.2012, 21:11 13
Корректнее сказать, что используются ссылки. Имхо.
1
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
04.09.2012, 21:17 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? или сам почитаешь и разберешься? лучше сперва почитай, и если что неясно - спроси. народ подсадит.
1
49 / 44 / 8
Регистрация: 06.09.2010
Сообщений: 419
04.09.2012, 21:19  [ТС] 15
novi4ok, твой ответ по-моему самый ясный для меня Что такое стек и куча я знаю.
0
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
04.09.2012, 21:41 16
я видел даже такой код (два раза!):
C++
1
2
int *pI = new int();
...
спрашивал человека (первого. он был студент. второй был школьник, он еще, возможно, разберется, не спрашивал), зачем это так. толком объяснить не сумел, но мне показалось, он хотел показать (кому? себе, наверное), что он с указателями на короткой ноге.
1
Twilight Parasite
154 / 150 / 7
Регистрация: 21.07.2011
Сообщений: 908
04.09.2012, 21:43 17
novi4ok, такой пример в википедии есть, вот люди и страдают фигней
1
49 / 44 / 8
Регистрация: 06.09.2010
Сообщений: 419
04.09.2012, 21:56  [ТС] 18
Если честно, я с указателями скоко не боролся - так понять полностью не могу. Книг 10 использовал, искал где понятнее, на форумах спрашивал. Но так и не понял их. Мож я глупый, мож еще что то
0
бжни
2473 / 1684 / 135
Регистрация: 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
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
04.09.2012, 22:10 20
Цитата Сообщение от novi4ok Посмотреть сообщение
не указателем, а handle'ом. далеко не одно и то же
Обычно (если не всегда) хэндл - это и есть указатель.
1
04.09.2012, 22:10
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.09.2012, 22:10
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru