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

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

Войти
Регистрация
Восстановить пароль
 
 
Ullaluna
8 / 6 / 1
Регистрация: 11.11.2013
Сообщений: 75
#1

Способ создания экземпляра класса - C++

23.02.2014, 21:02. Просмотров 905. Ответов 15
Метки нет (Все метки)

Ниже в скрипте отметила два варианта. В чужих скриптах встречаю оба время от времени. Интересно, в чем принципиальное различие и как вернее.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
using namespace std;
 
class A {
};
 
class B : public A {
};
 
int main() {
 A *pa = new B(); //первый вариант записи
 A *pa = new B; //второй вариант записи
 
 return 0;
}
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.02.2014, 21:02
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Способ создания экземпляра класса (C++):

Вызов метода класса без создания экземпляра класса. - C++
В общем мне для функционирования одной программы нужно постоянно вызывать метод одного из классов. Я это делаю с помощью new - delete. Мне...

Такой способ создание экземпляра класса хорошо или плохо? - C++
Объясните пожалуйста в чем есть плохо создавать экземпляр класса вот так? class A{ /*.....*/ }objA; нежели так :

Ошибка создания экземпляра класса - C++
Собственно ошибка в мейне error C2227: left of '-&gt;AddLast' must point to class/struct/union/generic type Содержимое StringList.h: ...

При создании экземпляра класса, создается 2 экземпляра вместо 1 - C++
Подсчет экземпляров ведется с помощью статического члена num_dogs, который во всех трех конструкторах (1. по умолчанию, 2. со всеми...

Создание нового экземпляра дочернего класса из экземпляра базового - C++
Всем привет! Извиняюсь, если вопрос глупый, но что-то не смог найти конкретный ответ на него... У меня есть несколько классов: все они...

Сложение экземпляра базового класса и экземпляра наследника - C++
Добрый вечер! Моя задача - сложить экземпляр базового класса и наследника. Нужно сделать так, чтобы результат сложения &quot;знал&quot;...

15
DrOffset
7376 / 4453 / 1009
Регистрация: 30.01.2014
Сообщений: 7,304
23.02.2014, 21:17 #2
В случае классов разницы нет.
Разница заметна для встроенных типов.
Например:
C++
1
2
3
4
5
int * a = new int;
// в *a - мусор
 
int * a = new int();
// в *a - ноль
Добавлено через 4 минуты
Это играет роль, например, когда мы пишем шаблон:
C++
1
2
3
4
5
6
7
8
template <typename T>
T * createObject()
{
// если тут не поставить скобки, то в случае T=='встроенный тип' не будет инициализации нулем
    return new T(); 
}
 
int * p = createObject<int>();
1
Ullaluna
8 / 6 / 1
Регистрация: 11.11.2013
Сообщений: 75
23.02.2014, 21:24  [ТС] #3
Спасибо.

Меня смутило, что вопрос был в тесте и звучал как "создать экземпляр класса, используя new". Два другие варианта были точно неверными, остаются два, которые я привела.
Неграмотность составителя теста я, в принципе, не исключаю. Но может, есть разница в плане "хорошего стиля", знания каких-то тонкостей и подсознательных комплексов оператора new?..
0
DrOffset
7376 / 4453 / 1009
Регистрация: 30.01.2014
Сообщений: 7,304
23.02.2014, 21:42 #4
Цитата Сообщение от Ullaluna Посмотреть сообщение
Но может, есть разница в плане "хорошего стиля", знания каких-то тонкостей и подсознательных комплексов оператора new?..
В случае класса (типа, объявленного ключевым словом class) - оба варианта полностью эквивалентны.
Если у нас не класс, а структура, то будут различия в том случае, если структура - POD.

А писать или не писать скобки может зависеть от многих вещей, например выделение памяти и отложенная инициализация. Очевидно в этом случае инициализация по умолчанию нулями не нужна.
С точки зрения обобщения, конечно, вариант со скобками предпочтительнее (см. пример с шаблоном), но однозначных рекомендаций "хорошо" или "плохо", лично я бы не стал давать.
0
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
23.02.2014, 22:10 #5
DrOffset, не важно класс или структура. Важно наличие или отсутствие конструктора по умолчанию. Если конструктора нет, то при записи со скобками члены будут инициализированы значением по умолчанию, при записи без скобок члены (фундаментальные типы) останутся не проинициализированы. Если конструктор есть, то он будет вызван в любом случае и члены будут инициализированы в соответствием с кодом в конструкторе.
1
DrOffset
7376 / 4453 / 1009
Регистрация: 30.01.2014
Сообщений: 7,304
23.02.2014, 22:37 #6
Цитата Сообщение от Tulosba Посмотреть сообщение
не важно класс или структура.
Согласен, не важно.
Остальное все собственно вытекало из определения POD. Определяя конструктор, мы уходим от POD. Делая, членом класса std::string - мы так же уходим от POD, однако конструктор можно и не определять. Следовательно первично наличие POD, а конструктор уже как следствие.
1
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
23.02.2014, 22:57 #7
Цитата Сообщение от DrOffset Посмотреть сообщение
Определяя конструктор, мы уходим от POD.
Согласен. Можно также и функцию виртуальную добавить.
0
DrOffset
7376 / 4453 / 1009
Регистрация: 30.01.2014
Сообщений: 7,304
23.02.2014, 22:58 #8
Я размышлял откуда взялось мое заблуждение насчет класса и понял, что ноги растут из стандарта С++03:
An aggregate is an array or a class (clause 9) with no user-declared constructors (12.1), no private or protected non-static data members (clause 11), no base classes (clause 10), and no virtual functions (10.3).
Так как в классе по-умолчанию действует private. Однако стоило определить класс с public POD полями - он тоже становился POD.
В С++11 сильно ослабили эту формулировку и, насколько мне известно, теперь такого ограничения нет (как и некоторых других).
В любом случае твое замечание абсолютно правомерно, спасибо
0
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
23.02.2014, 23:05 #9
Цитата Сообщение от DrOffset Посмотреть сообщение
В С++11 сильно ослабили эту формулировку
В C++11 POD = тривиальный + стандартное размещение.
А на тему struct/class уже как аксиома - полностью заменимы за исключением уровня доступа по умолчанию.
0
DrOffset
7376 / 4453 / 1009
Регистрация: 30.01.2014
Сообщений: 7,304
23.02.2014, 23:08 #10
Цитата Сообщение от Tulosba Посмотреть сообщение
В C++11 POD = тривиальный + стандартное размещение.
Именно.
Я говорил о том, что в С++03 вот такой класс:
C++
1
2
3
4
class A
{
    int a;
};
не являлся POD. Однако в С++11 - он POD является.
0
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
23.02.2014, 23:18 #11
DrOffset, правильно ли я понял, что тогда в C++03 такой код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
 
class A
{
    int a;
    friend void f( A* a );
};
 
void f( A* a ) 
{
    std::cout << a->a << std::endl; 
}
 
int main() {
 
    A* a = new A(); 
    f( a );
 
    return 0;
}
должен выдать мусор несмотря на наличие скобок?
0
DrOffset
7376 / 4453 / 1009
Регистрация: 30.01.2014
Сообщений: 7,304
23.02.2014, 23:29 #12
Цитата Сообщение от Tulosba Посмотреть сообщение
должен выдать мусор несмотря на наличие скобок?
Да, но я ни разу не наблюдал такого на практике. Однако вряд ли все компиляторы, на которых я пробовал, настолько строго соответствовали стандарту. Более того, даже определяя виртуальную функцию, переменная все равно в этом случае будет ноль (в GCC).
0
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
23.02.2014, 23:41 #13
Цитата Сообщение от DrOffset Посмотреть сообщение
Да, но я ни разу не наблюдал такого на практике.
Проверил на VS 2010/2012, получаю 0. При этом добавление виртуальной функции - сразу мусор (0xCDCDCDCD), т.е. не инициализированная память. Так что с C++03 не очень ясно.
0
DrOffset
7376 / 4453 / 1009
Регистрация: 30.01.2014
Сообщений: 7,304
23.02.2014, 23:44 #14
Цитата Сообщение от Tulosba Посмотреть сообщение
Так что с C++03 не очень ясно.
Я привел цитату из стандарта
Тут все ясно, в том числе и то, что Visual Studio, как и GCC, в этом плане ему не соответствуют.
0
kvadro
11 / 9 / 1
Регистрация: 12.03.2012
Сообщений: 127
24.02.2014, 02:28 #15
должен выдать мусор несмотря на наличие скобок?
Тут вообще интересное поведение с этими значениями по умолчанию.

Непонятное поведение
0
24.02.2014, 02:28
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.02.2014, 02:28
Привет! Вот еще темы с ответами:

Удаление экземпляра класса в функции самого класса (Ошибка при отладке) - C++
Допустим, у нас есть класс Buffer, который хранит в себе указатель на класс некоторой матрицы и количество этих указателей refcounter ...

Явное создание экземпляра класса и явная специализация шаблона класса - C++
Всем добрый день! Не могу разобраться - эти две технологии дают один и тот же результат? В каких случаях применять одно и другое?...

Передача свойства одного экземпляра класса другому экземпляру класса - C++
#include &lt;tchar.h&gt; class A { public: A(); int aVar; }; class B : public A

Пример класса с конструктором и деструктором, создание экземпляра класса через конструктор с параметрами - C++
Привести пример класса с конструктором и деструктором, созданием экземпляра класса с помощью конструктора с параметрами.


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

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

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