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

Как создать объект класса в динамической памяти? - C++

Восстановить пароль Регистрация
 
lest_
0 / 0 / 0
Регистрация: 28.11.2013
Сообщений: 94
21.07.2014, 18:51     Как создать объект класса в динамической памяти? #1
привет. я так понял, можно создать объект в динамической области памяти. либо просто создать объект обычным способом, но чтобы его данные-члены были указателями на переменные в динамической памяти. я написал 2 варианта:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// Создать объект в динамической памяти
#include <iostream>
using namespace std;
 
class SimpleCat
{
public:
    SimpleCat()
    {
        cout << "In the Constructor" << endl;
        itsAge = 1;
    }
    ~SimpleCat() { cout << "DESTRUCTOR" << endl; }
private:
    int itsAge;
};
 
int main()
{
    {
        SimpleCat* p = new SimpleCat;
        delete p;
        p = 0;  
    }
    system("pause");                
    return 0;     
}
Результат:
In the Constructor
DESTRUCTOR
Для продолжения нажмите любую клавишу...

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
// В качестве переменной-члена выступает указатель на переменную в динамической памяти
#include <iostream>
using namespace std;
 
class SimpleCat
{
public:
    SimpleCat()
    {
        cout << "In the Constructor" << endl;
        pAge = new int(2);
    }
    ~SimpleCat() 
    {
        cout << "DESTRUCTOR" << endl;
        delete pAge;
        pAge = 0;
    }
private:
    int* pAge;
};
 
int main()
{
    {
        SimpleCat Frisky;       
    }
    system("pause");                
    return 0;     
}
Результат тот же самый.
я хотел спросит: правильно ли я написал? и если правильно, то в чём вообще разница в этих способах? как надо в реальной программе писать?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.07.2014, 18:51     Как создать объект класса в динамической памяти?
Посмотрите здесь:

C++ Двумерный массив в динамической памяти как поле класса
Классы. Объявить массив динамически и сделать указатель на объект в динамической памяти C++
C++ Указатель,объект класса размещенный в динамической памяти
Обращение к свойству класса в динамической памяти C++
C++ Выделение динамической памяти под массив из класса
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6172 / 2901 / 284
Регистрация: 04.12.2011
Сообщений: 7,723
Записей в блоге: 3
21.07.2014, 19:14     Как создать объект класса в динамической памяти? #2
Цитата Сообщение от lest_ Посмотреть сообщение
либо просто создать объект обычным способом, но чтобы его данные-члены были указателями на переменные в динамической памяти.
lest_, если Вы задаётесь такими вопросами, то сосредоточьтесь на создании динамических объектов. Логика подобъектов станет понятна позже, так как она подобна. Объект включающий динамические подобъекты сложнее "простого" объекта и использовать такое без необходимости пока не стоит.
Создавая "простой" объект в динамической памяти Вы берёте на себя ответственность по его уничтожению. Использовав new Вы где-то должны использовать delete. У "сложного" (имеющего динамические подобъекты) объекта, объектом будете по прежнему заниматься Вы, ведь никто не запретит Вам создать динамический объект и в этом случае, а подобъектами - сам объект (конструктор/деструктор). Но для "сложных" объектов нужно позаботиться о конструкторе копирования, так как предоставляемый по умолчанию, обычно не подходит в этом случае и скорее всего о операторе присваивания. Для простых "простых" (2 раза)) объектов в этом нет необходимости.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
21.07.2014, 22:33     Как создать объект класса в динамической памяти? #3
Цитата Сообщение от lest_ Посмотреть сообщение
Результат тот же самый.
Если под результатом Вы понимаете последовательность вывода:
"In the Constructor"
"DESTRUCTOR"
"Для продолжения нажмите любую клавишу..."
, то можно и про такую программу сказать, что разницы нет:
C++
1
2
3
4
5
6
7
#include <iostream>
#include <cstdlib>
int main()
{
   std::cout << "In the Constructor\nDESTRUCTOR\n";
   std::system("pause");
}
Но вряд она Вам подойдет.
Поэтому, всё же стоит понять различия.
В первом случае создается весь объект SimpleCat в динамической памяти. Со всем своим содержимым (т.е. полем itsAge).
А во втором случае объект типа SimpleCat создается на стеке, а для поля pAge память выделяется в куче.
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,058
21.07.2014, 22:39     Как создать объект класса в динамической памяти? #4
lest_,
в первом случае тебе к членам класса нужно будет обращаться так
C++
1
 p->itsAge;
во втором так
C++
1
p.itsAge
пример конечно надуманный поскольку itsAge у тебя приватная
но я так чтобы показать разницу
прочитай что такое указатель
и только потом про динамическое выделение
иначе все перемешается
Yandex
Объявления
21.07.2014, 22:39     Как создать объект класса в динамической памяти?
Ответ Создать тему
Опции темы

Текущее время: 16:36. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru