8 / 6 / 5
Регистрация: 11.11.2013
Сообщений: 75
|
||||||
1 | ||||||
Способ создания экземпляра класса23.02.2014, 21:02. Показов 14119. Ответов 15
Метки нет (Все метки)
Ниже в скрипте отметила два варианта. В чужих скриптах встречаю оба время от времени. Интересно, в чем принципиальное различие и как вернее.
0
|
23.02.2014, 21:02 | |
Ответы с готовыми решениями:
15
Вызов метода класса без создания экземпляра класса. Такой способ создание экземпляра класса хорошо или плохо? Ошибка создания экземпляра класса Создание нового экземпляра дочернего класса из экземпляра базового |
18822 / 9826 / 2401
Регистрация: 30.01.2014
Сообщений: 17,260
|
|||||||||||
23.02.2014, 21:17 | 2 | ||||||||||
В случае классов разницы нет.
Разница заметна для встроенных типов. Например:
Это играет роль, например, когда мы пишем шаблон:
1
|
8 / 6 / 5
Регистрация: 11.11.2013
Сообщений: 75
|
|
23.02.2014, 21:24 [ТС] | 3 |
Спасибо.
Меня смутило, что вопрос был в тесте и звучал как "создать экземпляр класса, используя new". Два другие варианта были точно неверными, остаются два, которые я привела. Неграмотность составителя теста я, в принципе, не исключаю. Но может, есть разница в плане "хорошего стиля", знания каких-то тонкостей и подсознательных комплексов оператора new?..
0
|
18822 / 9826 / 2401
Регистрация: 30.01.2014
Сообщений: 17,260
|
|
23.02.2014, 21:42 | 4 |
В случае класса (типа, объявленного ключевым словом class) - оба варианта полностью эквивалентны.
Если у нас не класс, а структура, то будут различия в том случае, если структура - POD. А писать или не писать скобки может зависеть от многих вещей, например выделение памяти и отложенная инициализация. Очевидно в этом случае инициализация по умолчанию нулями не нужна. С точки зрения обобщения, конечно, вариант со скобками предпочтительнее (см. пример с шаблоном), но однозначных рекомендаций "хорошо" или "плохо", лично я бы не стал давать.
0
|
:)
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
|
|
23.02.2014, 22:10 | 5 |
DrOffset, не важно класс или структура. Важно наличие или отсутствие конструктора по умолчанию. Если конструктора нет, то при записи со скобками члены будут инициализированы значением по умолчанию, при записи без скобок члены (фундаментальные типы) останутся не проинициализированы. Если конструктор есть, то он будет вызван в любом случае и члены будут инициализированы в соответствием с кодом в конструкторе.
1
|
18822 / 9826 / 2401
Регистрация: 30.01.2014
Сообщений: 17,260
|
|
23.02.2014, 22:37 | 6 |
Согласен, не важно.
Остальное все собственно вытекало из определения POD. Определяя конструктор, мы уходим от POD. Делая, членом класса std::string - мы так же уходим от POD, однако конструктор можно и не определять. Следовательно первично наличие POD, а конструктор уже как следствие.
1
|
18822 / 9826 / 2401
Регистрация: 30.01.2014
Сообщений: 17,260
|
|
23.02.2014, 22:58 | 8 |
Я размышлял откуда взялось мое заблуждение насчет класса и понял, что ноги растут из стандарта С++03:
В С++11 сильно ослабили эту формулировку и, насколько мне известно, теперь такого ограничения нет (как и некоторых других). В любом случае твое замечание абсолютно правомерно, спасибо
0
|
18822 / 9826 / 2401
Регистрация: 30.01.2014
Сообщений: 17,260
|
||||||
23.02.2014, 23:08 | 10 | |||||
Именно.
Я говорил о том, что в С++03 вот такой класс:
0
|
:)
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
|
||||||
23.02.2014, 23:18 | 11 | |||||
DrOffset, правильно ли я понял, что тогда в C++03 такой код:
0
|
18822 / 9826 / 2401
Регистрация: 30.01.2014
Сообщений: 17,260
|
|
23.02.2014, 23:29 | 12 |
Да, но я ни разу не наблюдал такого на практике. Однако вряд ли все компиляторы, на которых я пробовал, настолько строго соответствовали стандарту. Более того, даже определяя виртуальную функцию, переменная все равно в этом случае будет ноль (в GCC).
0
|
18822 / 9826 / 2401
Регистрация: 30.01.2014
Сообщений: 17,260
|
|
23.02.2014, 23:44 | 14 |
Я привел цитату из стандарта
Тут все ясно, в том числе и то, что Visual Studio, как и GCC, в этом плане ему не соответствуют.
0
|
12 / 10 / 1
Регистрация: 12.03.2012
Сообщений: 127
|
|
24.02.2014, 02:28 | 15 |
0
|
18822 / 9826 / 2401
Регистрация: 30.01.2014
Сообщений: 17,260
|
||||||||||||||||||||||||||
24.02.2014, 20:14 | 16 | |||||||||||||||||||||||||
Сообщение было отмечено как решение
Решение
В общем ситуация оказалась несколько сложнее.
Во-первых я был не прав в своей оценке поведения согласно стандарту С++03. Итак, для начала разберемся что такое POD: 9/4 8.5.1/1
Tulosba предположил, что в примере: Кликните здесь для просмотра всего текста
Не будет вследствие этого выполняться инициализация поля a и я согласился с этим. Как оказалось - это не так. В стандарте С++03 есть три типа инициализации: zero-initialization, default-initialization и value-initialization. В рамках стандарта С++03 вышеуказанный пример приводит как раз к value-initialization. Т.к. тип не является POD и отсутствует user-defined конструктор копирования. 8.5/5 8.5/7 Параграф 8.5/5 имел другой вид (отсутствовала value-initialization, вместо нее в этом случае использовалась default-initialization): Исходя и вышесказанного можно рассмотреть такой пример:
В С++11 изменилась формулировка и класс с приватными полями так же может считаться POD-классом. Кликните здесь для просмотра всего текста
9/10
6
|
24.02.2014, 20:14 | |
24.02.2014, 20:14 | |
Помогаю со студенческими работами здесь
16
При создании экземпляра класса, создается 2 экземпляра вместо 1 Сложение экземпляра базового класса и экземпляра наследника Удаление экземпляра класса в функции самого класса (Ошибка при отладке) Явное создание экземпляра класса и явная специализация шаблона класса Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |