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

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

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

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

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

Собственно, что происходит, когда создаёшь объект класса без скобок в название после new?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
flerris
3 / 3 / 0
Регистрация: 17.08.2012
Сообщений: 145
26.04.2013, 09:03     Есть ли разница между MyClass *c = new MyClass() и MyClass *c = new MyClasss; #2
Цитата Сообщение от FarStar Посмотреть сообщение
Собственно, что происходит, когда создаёшь объект класса без скобок в название после new?
если со скобками то с конструктором по умолчанию, а если без, то без конструктора

Добавлено через 11 минут
Цитата Сообщение от flerris Посмотреть сообщение
если со скобками то с конструктором по умолчанию, а если без, то без конструктора
не, не так
вроде в одном случае все поля заполняются нулями а во втором нет. А у Шилдта не смотрел?
ForEveR
В астрале
Эксперт С++
7968 / 4730 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
26.04.2013, 09:21     Есть ли разница между MyClass *c = new MyClass() и MyClass *c = new MyClasss; #3
flerris, Оба варианта неверны.
Для не POD типов - вызов конструктора по умолчанию производится в любом случае.
Для POD типов - при первом варианте, будет инициализация нулем, при втором, переменная останется неинициализированной.
FarStar
Заблокирован
26.04.2013, 09:29  [ТС]     Есть ли разница между MyClass *c = new MyClass() и MyClass *c = new MyClasss; #4
Цитата Сообщение от ForEveR Посмотреть сообщение
flerris, Оба варианта неверны.
Для не стандартных типов - вызов конструктора по умолчанию производится в любом случае.
Для стандартных - при первом варианте, будет инициализация нулем, при втором, переменная останется неинициализированной.
Что я не понял, о каких стандартных типах идёт речь, о POD? Нельзя ли крошечный пример для обоих случаев привести пожалуйста?
ForEveR
В астрале
Эксперт С++
7968 / 4730 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
26.04.2013, 09:33     Есть ли разница между MyClass *c = new MyClass() и MyClass *c = new MyClasss; #5
FarStar, Вот, отличный ответ на данный вопрос. http://stackoverflow.com/questions/6...rence-with-new
vxg
Модератор
3112 / 1914 / 206
Регистрация: 13.01.2012
Сообщений: 7,300
26.04.2013, 09:45     Есть ли разница между MyClass *c = new MyClass() и MyClass *c = new MyClasss; #6
Цитата Сообщение от ForEveR Посмотреть сообщение
при первом варианте, будет инициализация нулем,
каким нулем?

C++
1
2
3
4
5
6
7
struct my_type //POD
{
    int a;
};
 
my_type *bbb = new my_type; //в поле a хлам
my_type *ccc = new my_type(); //в поле a хлам
Добавлено через 3 минуты
...хотя codepad.org во втором случае дает ноль. сдается мне правильный ответ - делайте так что бы не рассчитывать на то чего может не быть. инициализация нулем глобальных объектов известна, а вот про динамические слышу к своему стыду впервые и как видим не везде такое поддерживается
ForEveR
В астрале
Эксперт С++
7968 / 4730 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
26.04.2013, 09:46     Есть ли разница между MyClass *c = new MyClass() и MyClass *c = new MyClasss; #7
vxg, Вот цитата из стандарта. Если проследить путь - получается ровно то же, что и в ответе на SO.
A new-expression that creates an object of type T initializes that object as follows:
— If the new-initializer is omitted, the object is default-initialized (8.5); if no initialization is performed,
the object has indeterminate value.
— Otherwise, the new-initializer is interpreted according to the initialization rules of 8.5 for direct-
initialization.

To default-initialize an object of type T means:
— if T is a (possibly cv-qualified) 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, no initialization is performed.

The initialization that occurs in the forms
T x(a);
T x{a};
is called direct-initialization.

— If the initializer is (), the object is value-initialized.

To value-initialize an object of type T means:
— if T is a (possibly cv-qualified) class type (Clause 9) with either no default constructor (12.1) or a
default constructor that is user-provided or deleted, then the object is default-initialized;
— if T is a (possibly cv-qualified) non-union class type without a user-provided or deleted default construc-
tor, then the object is zero-initialized and, if T has a non-trivial default constructor, default-initialized;
— if T is an array type, then each element is value-initialized;
— otherwise, the object is zero-initialized.

To zero-initialize an object or reference of type T means:
— if T is a scalar type (3.9), the object is set to the value 0 (zero), taken as an integral constant expression,
converted to T;103
— if T is a (possibly cv-qualified) non-union class type, each non-static data member and each base-class
subobject is zero-initialized and padding is initialized to zero bits;
— if T is a (possibly cv-qualified) union type, the object’s first non-static named data member is zero-
initialized and padding is initialized to zero bits;
— if T is an array type, each element is zero-initialized;
— if T is a reference type, no initialization is performed.
Tulosba
:)
Эксперт С++
4392 / 3235 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
26.04.2013, 09:52     Есть ли разница между MyClass *c = new MyClass() и MyClass *c = new MyClasss; #8
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
 
struct S
{
    int v;
};
 
int main()
{
 
    S *s1 = new S;
    std::cout << s1->v << std::endl; // хлам 
 
    S *s2 = new S();
    std::cout << s2->v << std::endl; // 0 
 
    system( "pause" );
}
Добавлено через 51 секунду
Цитата Сообщение от vxg Посмотреть сообщение
как видим не везде такое поддерживается
где не поддерживается?
vxg
Модератор
3112 / 1914 / 206
Регистрация: 13.01.2012
Сообщений: 7,300
26.04.2013, 10:00     Есть ли разница между MyClass *c = new MyClass() и MyClass *c = new MyClasss; #9
Цитата Сообщение от ForEveR Посмотреть сообщение
Вот цитата из стандарта
только из какого именно
Цитата Сообщение от Tulosba Посмотреть сообщение
где не поддерживается?
ну конечно же мой любимый и непогрешимый самый лучший на свете borland c++ builder 6. год выпуска вроде 2002 и стандарт 98 на который ссылаются на стеке вроде должен поддерживаться... хз
ForEveR
В астрале
Эксперт С++
7968 / 4730 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
26.04.2013, 10:03     Есть ли разница между MyClass *c = new MyClass() и MyClass *c = new MyClasss; #10
vxg, C++11. Но отличия минимальны в данном конкретном случае.
Tulosba
:)
Эксперт С++
4392 / 3235 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
26.04.2013, 10:31     Есть ли разница между MyClass *c = new MyClass() и MyClass *c = new MyClasss; #11
Цитата Сообщение от vxg Посмотреть сообщение
самый лучший на свете borland c++ builder 6
закопайте его подальше и забудьте как страшный сон.
vxg
Модератор
3112 / 1914 / 206
Регистрация: 13.01.2012
Сообщений: 7,300
26.04.2013, 10:33     Есть ли разница между MyClass *c = new MyClass() и MyClass *c = new MyClasss; #12
Цитата Сообщение от Tulosba Посмотреть сообщение
закопайте его подальше и забудьте как страшный сон
вы просто забыли первое правило разработчика раз даете такие советы
Tulosba
:)
Эксперт С++
4392 / 3235 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
26.04.2013, 10:36     Есть ли разница между MyClass *c = new MyClass() и MyClass *c = new MyClasss; #13
vxg, я даю такие советы лишь потому, что не раз обжигался на глюках bcb6
vxg
Модератор
3112 / 1914 / 206
Регистрация: 13.01.2012
Сообщений: 7,300
26.04.2013, 10:41     Есть ли разница между MyClass *c = new MyClass() и MyClass *c = new MyClasss; #14
Цитата Сообщение от Tulosba Посмотреть сообщение
глюках bcb6
ни о каких глюках (прям глюках) не слышал. может вы не умеете его готовить?
FarStar
Заблокирован
26.04.2013, 10:42  [ТС]     Есть ли разница между MyClass *c = new MyClass() и MyClass *c = new MyClasss; #15
C++
1
2
3
4
5
6
7
8
9
10
11
12
class A
{
   A();
   ~A();
   int x;
   std::vecotr<int> y;
}
class B : public A
{
   B();
   ~B();
}
Так что, какое резюме, чему будут равны поля x и y в классе B при:
C++
1
2
3
B b;
B *b=new B;
B *b=new B();
?
ForEveR
В астрале
Эксперт С++
7968 / 4730 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 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
Модератор
3112 / 1914 / 206
Регистрация: 13.01.2012
Сообщений: 7,300
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
:)
Эксперт С++
4392 / 3235 / 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 Посмотреть сообщение
а вы разобрались почему оно так?
пришлось. Но когда проект содержит несколько сотен тысяч строк, поиск таких ошибок совсем не радует.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.04.2013, 11:18     Есть ли разница между 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++

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

Или воспользуйтесь поиском по форуму:
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();
дайте чёткий ответ итить расколотить
Yandex
Объявления
26.04.2013, 11:18     Есть ли разница между MyClass *c = new MyClass() и MyClass *c = new MyClasss;
Ответ Создать тему
Опции темы

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