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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
FarStar
Заблокирован
#1

Есть ли разница между MyClass *c = new MyClass() и MyClass *c = new MyClasss; - C++

26.04.2013, 08:29. Просмотров 1243. Ответов 27
Метки нет (Все метки)

Собственно, что происходит, когда создаёшь объект класса без скобок в название после new?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
26.04.2013, 10:46     Есть ли разница между MyClass *c = new MyClass() и MyClass *c = new MyClasss; #16
FarStar, Это не под класс. Так что зависит от того как инициализирует конструктор.
Во всех трех случаях будет вызван конструктор без аргументов.
Tulosba
26.04.2013, 10:57
  #17

Не по теме:

Цитата Сообщение от vxg Посмотреть сообщение
ни о каких глюках (прям глюках) не слышал
Вот Вам тестик небольшой для начала:
C++
1
2
3
4
5
6
7
AnsiString a = "a";
AnsiString b = "b";
 
while( true )
{
   AnsiString c =  true ? AnsiString( a + b ) : AnsiString( "" ) ;
}
Понаблюдайте за памятью.

vxg
Модератор
3143 / 1945 / 214
Регистрация: 13.01.2012
Сообщений: 7,437
26.04.2013, 11:06     Есть ли разница между MyClass *c = new MyClass() и MyClass *c = new MyClasss; #18
Цитата Сообщение от Tulosba Посмотреть сообщение
Понаблюдайте за памятью.
и это отвратило вас от bcb ? ну, не делайте так. с тем же успехом я могу привести вам ляпы из STD

Добавлено через 2 минуты

Не по теме:

*шепотом* а вы разобрались почему оно так? например

C++
1
2
3
4
5
6
7
8
9
   AnsiString c;
   if (true)
   {
       c = AnsiString( a + b );
   }
   else
   {
       c = AnsiString( "" ) ;
   }
не имеет такого эффекта

Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
26.04.2013, 11:14     Есть ли разница между MyClass *c = new MyClass() и MyClass *c = new MyClasss; #19
vxg, не только это, конечно. Но не буду же я тут все глюки вспоминать, с которыми сталкивался при работе с быдлером. Просто в очередной прекрасный момент было принято решение ничего нового на нем не создавать. Именно по причине кривизны среды.
Цитата Сообщение от vxg Посмотреть сообщение
вам ляпы из STD
Что за STD?

Добавлено через 1 минуту
Цитата Сообщение от vxg Посмотреть сообщение
а вы разобрались почему оно так?
пришлось. Но когда проект содержит несколько сотен тысяч строк, поиск таких ошибок совсем не радует.
FarStar
Заблокирован
26.04.2013, 11:18  [ТС]     Есть ли разница между MyClass *c = new MyClass() и MyClass *c = new MyClasss; #20
Шьёрт побъери
хрен с этим наследованием
C++
1
2
3
4
5
6
7
class A
{
A();
~A();
int x;
td::vecotr<int> y;
}
C++
1
2
3
A a;
A *a=new A;
A *a=new A();
дайте чёткий ответ итить расколотить
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
26.04.2013, 11:28     Есть ли разница между MyClass *c = new MyClass() и MyClass *c = new MyClasss; #21
FarStar, Все равно, есть user-defined конструктор, потому всегда будет вызван он. А вот какова будет инициализация в конструкторе - дело того кто его пишет.
FarStar
Заблокирован
26.04.2013, 11:37  [ТС]     Есть ли разница между MyClass *c = new MyClass() и MyClass *c = new MyClasss; #22
Цитата Сообщение от ForEveR Посмотреть сообщение
FarStar, Все равно, есть user-defined конструктор, потому всегда будет вызван он. А вот какова будет инициализация в конструкторе - дело того кто его пишет.
Ну вот в моём примере конструкторе ничего не инициализировалось, значит всё мусор?
А если нет юзер конструктора, тогда что?
я просто пытаюсь понять, в чём разница между new A() и new A ? видел такой вопрос в одном тесте brainbrench
vxg
Модератор
3143 / 1945 / 214
Регистрация: 13.01.2012
Сообщений: 7,437
26.04.2013, 11:41     Есть ли разница между MyClass *c = new MyClass() и MyClass *c = new MyClasss; #23
Цитата Сообщение от Tulosba Посмотреть сообщение
быдлером
назовите на чем вы сейчас пишите, я тоже хочу назвать эту среду гамном имеющей недостатки
Цитата Сообщение от Tulosba Посмотреть сообщение
Что за STD?
ну типа std::и_все_что_тут_пишется
Цитата Сообщение от Tulosba Посмотреть сообщение
Но когда проект содержит несколько сотен тысяч строк
когда проект содержит сотни тысяч строк говонокода вдруг оказывается виноватой среда разработки... не, пример хороший, просто реально за практику работы не сталкивался с таким. делал и так и сяк (то есть пользуясь классами VCL или пользуясь std::string что мне ближе). ни разу не "попал". может "гребешок" был редкий или "чесал" в другую сторону.

Добавлено через 1 минуту
Цитата Сообщение от FarStar Посмотреть сообщение
если нет юзер конструктора, тогда что?
тогда среда сама сгенерит его. для простых полей инициализации не будет. для объектов будут вызываться констркторы по умолчанию
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
26.04.2013, 11:43     Есть ли разница между MyClass *c = new MyClass() и MyClass *c = new MyClasss; #24
Я пожалуй, слегка был не прав, приведя цитаты из стандарта С++11. Тут слегка изменились правила. Вот из 03.
A new-expression that creates an object of type T initializes that object as follows:
— If the new-initializer is omitted:
— If T is a (possibly cv-qualified) non-POD class type (or array thereof), the object is default-
initialized (8.5). If T is a const-qualified type, the underlying class type shall have a user-declared
default constructor.
— Otherwise, the object created has indeterminate value. If T is a const-qualified type, or a (possibly
cv-qualified) POD class type (or array thereof) containing (directly or indirectly) a member of
const-qualified type, the program is ill-formed;
— If the new-initializer is of the form (), the item is value-initialized (8.5);
— If the new-initializer is of the form (expression-list) and T is a class type, the appropriate constructor is
called, using expression-list as the arguments (8.5);
— If the new-initializer is of the form (expression-list) and T is an arithmetic, enumeration, pointer, or
pointer-to-member type and expression-list comprises exactly one expression, then the object is initial-
ized to the (possibly converted) value of the expression (8.5);
— Otherwise the new-expression is ill-formed.

To zero-initialize an object of type T means:
— if T is a scalar type (3.9), the object is set to the value of 0 (zero) converted to T;
— if T is a non-union class type, each nonstatic data member and each base-class subobject is zero-
initialized;
— if T is a union type, the object’s first named data member89) is zero-initialized;
— if T is an array type, each element is zero-initialized;
— if T is a reference type, no initialization is performed.
To default-initialize an object of type T means:
— if T is a non-POD class type (clause 9), the default constructor for T is called (and the initialization is
ill-formed if T has no accessible default constructor);
— if T is an array type, each element is default-initialized;
— otherwise, the object is zero-initialized.
To value-initialize an object of type T means:
— if T is a class type (clause 9) with a user-declared constructor (12.1), then the default constructor for T is
called (and the initialization is ill-formed if T has no accessible default constructor);
— if T is a non-union class type without a user-declared constructor, then every non-static data member
and base-class component of T is value-initialized;
— if T is an array type, then each element is value-initialized;
— otherwise, the object is zero-initialized

Scalar types, POD-struct types,
POD-union types (clause 9), arrays of such types and cv-qualified versions of these types (3.9.3) are collec-
tively called POD types.

A POD-struct is an aggregate class that has no non-static data members of type non-POD-struct,
non-POD-union (or array of such types) or reference, and has no user-defined copy assignment operator
and no user-defined destructor.
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
26.04.2013, 11:46     Есть ли разница между MyClass *c = new MyClass() и MyClass *c = new MyClasss; #25
Цитата Сообщение от vxg Посмотреть сообщение
назовите на чем вы сейчас пишите, я тоже хочу назвать эту среду гамном имеющей недостатки
Всё говно, кроме мочи. У всех есть недостатки, только кто-то их исправляет, кто-то нет, у кого-то больше, у кого-то меньше. Ну и т.д, и т.п. На текущий момент можете похаить VS2010
Цитата Сообщение от vxg Посмотреть сообщение
ну типа std::и_все_что_тут_пишется
Если Вам не сложно, создайте тему, пообсуждаем. Потому что тут это уже дикий оффтоп и холивар.
Про глюки BC6 тоже можно создать тему, но для себя я уже решил никогда к этой среде не возвращаться, поэтому переубедить меня уже нельзя
vxg
Модератор
3143 / 1945 / 214
Регистрация: 13.01.2012
Сообщений: 7,437
26.04.2013, 11:49     Есть ли разница между MyClass *c = new MyClass() и MyClass *c = new MyClasss; #26
Цитата Сообщение от ForEveR Посмотреть сообщение
Я пожалуй, слегка был не прав, приведя цитаты из стандарта С++11. Тут слегка изменились правила. Вот из 03.
кстати, а как будет вести себя массив?
C++
1
my_type *a = new my_type[10];
есть ли тут способ управлять конструкторами создаваемых объектов и что будет происходить если конструктор без параметров был запрещен в определении типа?
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
26.04.2013, 11:56     Есть ли разница между MyClass *c = new MyClass() и MyClass *c = new MyClasss; #27
Цитата Сообщение от vxg Посмотреть сообщение
и что будет происходить если конструктор без параметров был запрещен в определении типа?
То массив создать не получится. При создании массива вызывается конструктор по умолчанию.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.04.2013, 12:01     Есть ли разница между MyClass *c = new MyClass() и MyClass *c = new MyClasss;
Еще ссылки по теме:
C++ Есть разница между C++Builder и Visual Studio?
Есть ли разница между подключениями 2-х и 1-ого заголовка? C++
C++ Есть ли разница между Visual C++, Borland C++ и C++ Builder?
C++ Определить, есть ли среди чисел в заданном интервале близнецы (простые числа, разница между которыми = 2)
Есть ли разница между подключением статической библиотеки и подключением одного только файла C++

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

Или воспользуйтесь поиском по форуму:
vxg
Модератор
3143 / 1945 / 214
Регистрация: 13.01.2012
Сообщений: 7,437
26.04.2013, 12:01     Есть ли разница между MyClass *c = new MyClass() и MyClass *c = new MyClasss; #28
Цитата Сообщение от Tulosba Посмотреть сообщение
похаить VS2010
среда исторически неполноценная нагло претендующая на извращение самого лучшего на свете языка путем приписывания к нему различного рода уродских расширений (в том числе, управляемых), деградирует все сильнее с каждой новой версией, предпринимает попытки залезть в душу при помощи выпуска свободных версий и наклеивания страз, судорожно попытается быть похожей на Borland C++ Builder 6 не смотря на органическую несовместимость своего графического дизайнера со здравым смыслом (к слову сказать XE так же пытается быть похожим на VS - зачем - это вопрос), интерфейс крайне враждебен и неудобен, настройки настолько сложны (некоторые этим хвалятся наивно полагая что теперь они могут настроить каждую строчку в своей программе), что легче пересесть на Linux (причем предварительно написав ядро, компилятор и выполнив сборку на собственноручно изготовленном чипе) имеющая свои недостатки

Добавлено через 1 минуту
Цитата Сообщение от Tulosba Посмотреть сообщение
То массив создать не получится. При создании массива вызывается конструктор по умолчанию.
логично. думал может чего не знаю.
Yandex
Объявления
26.04.2013, 12:01     Есть ли разница между MyClass *c = new MyClass() и MyClass *c = new MyClasss;
Ответ Создать тему
Опции темы

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