Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
Заблокирован
1

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

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

Собственно, что происходит, когда создаёшь объект класса без скобок в название после new?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.04.2013, 08:29
Ответы с готовыми решениями:

Vector<MyClass> MyVector или вектор типа MyClass - C++
Допустим у меня есть код ежедневника с классом Time, тут есть проверка времени, добавление...

Отличие Myclass& от Myclass* в аргументах функции
Доброго времени суток. Новичок в С++ (раньше писал на всяких питонах и пхп). Очень нравится...

Перебрать List<MyClass> со вложенными списками List<MyClass> в каждом элементе
Есть древовидная структура вида: List&lt;MyClass&gt; myClassList; //... public class MyClass{ ...

Char *a = myclass
Здраствуйте! Помогите пж: учу С++ давно и столкнулся с такой проблемой: надо преобразовать класс...

27
3 / 3 / 1
Регистрация: 17.08.2012
Сообщений: 145
26.04.2013, 09:03 2
Цитата Сообщение от FarStar Посмотреть сообщение
Собственно, что происходит, когда создаёшь объект класса без скобок в название после new?
если со скобками то с конструктором по умолчанию, а если без, то без конструктора

Добавлено через 11 минут
Цитата Сообщение от flerris Посмотреть сообщение
если со скобками то с конструктором по умолчанию, а если без, то без конструктора
не, не так
вроде в одном случае все поля заполняются нулями а во втором нет. А у Шилдта не смотрел?
0
В астрале
Эксперт С++
8023 / 4780 / 654
Регистрация: 24.06.2010
Сообщений: 10,558
26.04.2013, 09:21 3
flerris, Оба варианта неверны.
Для не POD типов - вызов конструктора по умолчанию производится в любом случае.
Для POD типов - при первом варианте, будет инициализация нулем, при втором, переменная останется неинициализированной.
2
Заблокирован
26.04.2013, 09:29  [ТС] 4
Цитата Сообщение от ForEveR Посмотреть сообщение
flerris, Оба варианта неверны.
Для не стандартных типов - вызов конструктора по умолчанию производится в любом случае.
Для стандартных - при первом варианте, будет инициализация нулем, при втором, переменная останется неинициализированной.
Что я не понял, о каких стандартных типах идёт речь, о POD? Нельзя ли крошечный пример для обоих случаев привести пожалуйста?
0
В астрале
Эксперт С++
8023 / 4780 / 654
Регистрация: 24.06.2010
Сообщений: 10,558
26.04.2013, 09:33 5
FarStar, Вот, отличный ответ на данный вопрос. http://stackoverflow.com/quest... e-with-new
1
Модератор
3309 / 2099 / 334
Регистрация: 13.01.2012
Сообщений: 8,160
26.04.2013, 09:45 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 во втором случае дает ноль. сдается мне правильный ответ - делайте так что бы не рассчитывать на то чего может не быть. инициализация нулем глобальных объектов известна, а вот про динамические слышу к своему стыду впервые и как видим не везде такое поддерживается
0
В астрале
Эксперт С++
8023 / 4780 / 654
Регистрация: 24.06.2010
Сообщений: 10,558
26.04.2013, 09:46 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.
1
:)
Эксперт С++
4763 / 3257 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
26.04.2013, 09:52 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 Посмотреть сообщение
как видим не везде такое поддерживается
где не поддерживается?
0
Модератор
3309 / 2099 / 334
Регистрация: 13.01.2012
Сообщений: 8,160
26.04.2013, 10:00 9
Цитата Сообщение от ForEveR Посмотреть сообщение
Вот цитата из стандарта
только из какого именно
Цитата Сообщение от Tulosba Посмотреть сообщение
где не поддерживается?
ну конечно же мой любимый и непогрешимый самый лучший на свете borland c++ builder 6. год выпуска вроде 2002 и стандарт 98 на который ссылаются на стеке вроде должен поддерживаться... хз
0
В астрале
Эксперт С++
8023 / 4780 / 654
Регистрация: 24.06.2010
Сообщений: 10,558
26.04.2013, 10:03 10
vxg, C++11. Но отличия минимальны в данном конкретном случае.
0
:)
Эксперт С++
4763 / 3257 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
26.04.2013, 10:31 11
Цитата Сообщение от vxg Посмотреть сообщение
самый лучший на свете borland c++ builder 6
закопайте его подальше и забудьте как страшный сон.
0
Модератор
3309 / 2099 / 334
Регистрация: 13.01.2012
Сообщений: 8,160
26.04.2013, 10:33 12
Цитата Сообщение от Tulosba Посмотреть сообщение
закопайте его подальше и забудьте как страшный сон
вы просто забыли первое правило разработчика раз даете такие советы
0
:)
Эксперт С++
4763 / 3257 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
26.04.2013, 10:36 13
vxg, я даю такие советы лишь потому, что не раз обжигался на глюках bcb6
0
Модератор
3309 / 2099 / 334
Регистрация: 13.01.2012
Сообщений: 8,160
26.04.2013, 10:41 14
Цитата Сообщение от Tulosba Посмотреть сообщение
глюках bcb6
ни о каких глюках (прям глюках) не слышал. может вы не умеете его готовить?
0
Заблокирован
26.04.2013, 10:42  [ТС] 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();
?
0
В астрале
Эксперт С++
8023 / 4780 / 654
Регистрация: 24.06.2010
Сообщений: 10,558
26.04.2013, 10:46 16
FarStar, Это не под класс. Так что зависит от того как инициализирует конструктор.
Во всех трех случаях будет вызван конструктор без аргументов.
0
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( "" ) ;
}
Понаблюдайте за памятью.

0
Модератор
3309 / 2099 / 334
Регистрация: 13.01.2012
Сообщений: 8,160
26.04.2013, 11:06 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( "" ) ;
   }
не имеет такого эффекта

0
:)
Эксперт С++
4763 / 3257 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
26.04.2013, 11:14 19
vxg, не только это, конечно. Но не буду же я тут все глюки вспоминать, с которыми сталкивался при работе с быдлером. Просто в очередной прекрасный момент было принято решение ничего нового на нем не создавать. Именно по причине кривизны среды.
Цитата Сообщение от vxg Посмотреть сообщение
вам ляпы из STD
Что за STD?

Добавлено через 1 минуту
Цитата Сообщение от vxg Посмотреть сообщение
а вы разобрались почему оно так?
пришлось. Но когда проект содержит несколько сотен тысяч строк, поиск таких ошибок совсем не радует.
0
Заблокирован
26.04.2013, 11:18  [ТС] 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();
дайте чёткий ответ итить расколотить
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.04.2013, 11:18

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

DataGridViev = BindingList<MyClass>
Доброго дня всем! dataGridViev = BindingList&lt;MyClass&gt; появляются пустые строки! какой метод...

Import com.test.MyClass.*
Добрый день! Объясните пожалуйста что дает импорт когда мы пишем ClassName.*, например import...

Сортировка BindingList<MyClass>
Как отсортировать этот список без переписываний туда-сюда по 10 раз? IEnumerable&lt;D1&gt; Query;...

Поиск в List<MyClass>
Здравствуйте у меня такой вопрос я создал класс с тремя полями данных разного типа class...


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

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

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