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

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

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

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

04.09.2012, 20:23. Просмотров 3495. Ответов 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
Петррр
6148 / 3448 / 338
Регистрация: 28.10.2010
Сообщений: 5,926
04.09.2012, 20:29 #2
Думаю что всем кто пишет на C++ приходится использовать new. new используется для динамического создания объектов, и вы сможете удалить в любое время. В Java есть сборщик мусора поэтому там не приходится думать о памяти.
1
Invader_Zim
Twilight Parasite
153 / 149 / 2
Регистрация: 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
Neon-z
46 / 41 / 1
Регистрация: 06.09.2010
Сообщений: 419
04.09.2012, 20:40  [ТС] #4
Invader_Zim, а почему надо указатель?
Без указателя же тоже прекрасно работает
0
Invader_Zim
Twilight Parasite
153 / 149 / 2
Регистрация: 21.07.2011
Сообщений: 908
04.09.2012, 20:41 #5
Neon-z, а статический объект разрушается делитом?
1
ForEveR
В астрале
Эксперт С++
7992 / 4751 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
04.09.2012, 20:41 #6
Neon-z, Без указателя это не работает. Вот как раз почитайте в книжке про оператор new и все вопросы отпадут. http://liveworkspace.org/code/2bd237de95c4c9c6e2386be64df8b4c2
1
Петррр
6148 / 3448 / 338
Регистрация: 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
Neon-z
46 / 41 / 1
Регистрация: 06.09.2010
Сообщений: 419
04.09.2012, 20:43  [ТС] #8
Спасибо. Буду разбираться.
0
Герц
524 / 341 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
04.09.2012, 20:51 #9
C++ можно сказать уникален в возможности создавать объекты на стеке, а не в куче (с использованием new), и этим стоит пользоваться везде где удается.
Без указателя же тоже прекрасно работает
C++
1
void* operator new( size_t );
вот сигнатура оператора new, возвращается указатель, так что сомнительно, что у тебя все прекрасно работает :-)
1
Neon-z
46 / 41 / 1
Регистрация: 06.09.2010
Сообщений: 419
04.09.2012, 21:03  [ТС] #10
Может я в свое время что то не так делал) я про указатель не помню, чтобы я его ставил, но все работало и даже как надо
Может сейчас путаница в голове из-за параллельного изучения java.
0
Герц
524 / 341 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
04.09.2012, 21:07 #11
Скорее всего, в Java все выглядело бы именно так.
Java
1
new test()
Причем именно так, а не
C++
1
new test
Java без скобочек не разрешает.
1
Neon-z
46 / 41 / 1
Регистрация: 06.09.2010
Сообщений: 419
04.09.2012, 21:09  [ТС] #12
В java используется неявлное использование указателей, то есть код
Java
1
 Test_Class object = new Test_Class()
уже подразумевает, что object является указателем на память.
0
Герц
524 / 341 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
04.09.2012, 21:11 #13
Корректнее сказать, что используются ссылки. Имхо.
1
novi4ok
551 / 504 / 8
Регистрация: 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
Neon-z
46 / 41 / 1
Регистрация: 06.09.2010
Сообщений: 419
04.09.2012, 21:19  [ТС] #15
novi4ok, твой ответ по-моему самый ясный для меня Что такое стек и куча я знаю.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.09.2012, 21:19
Привет! Вот еще темы с ответами:

Оператор 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)); ? ...


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

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

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