Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
mariellla
0 / 0 / 1
Регистрация: 05.09.2016
Сообщений: 40
#1

Создание/удаление объектов класса - C++

07.04.2017, 15:49. Просмотров 392. Ответов 1
Метки нет (Все метки)

Имеется следующий код:
cow.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#ifndef COW_H
#define COW_H
 
class Cow
{
private:
    char name[20];
    char * hobby;
    double weight;
    static int num;
 
public:
    Cow();
    Cow(const char * nm, const char * ho, double wt);
    Cow(const Cow & c);
    ~Cow();
    Cow & operator = (const Cow & c);
    void ShowCow() const;
};
 
#endif
cow.cpp
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <iostream>
#include <cstring>
#include "cow.h"
int Cow::num = 0;
 
Cow::Cow()
{
    num++;
    std::strcpy(name, "NULL-cow");
    hobby = new char[1];
    hobby[0] = '\0';
    weight = 0;
}
 
Cow::Cow(const char *nm, const char *ho, double wt)
{
    num++;
    std::strcpy(name, nm);
    int len = std::strlen(ho);
    hobby = new char[len+1];
    std::strcpy(hobby, ho);
    weight = wt;
}
 
Cow::Cow(const Cow &c)
{
    num++;
    std::strcpy(name, c.name);
    int len = std::strlen(c.hobby);
    hobby = new char[len+1];
    std::strcpy(hobby, c.hobby);
    weight = c.weight;
}
 
Cow::~Cow()
{
    std::cout << "\n\nObject " << name << " was delete, " << num - 1 << " remain." << std::endl;;
    num--;
    delete []hobby;
}
 
Cow & Cow::operator =(const Cow &c)
{
    if (this == &c)
        return *this;
    delete []hobby;
    int len = std::strlen(c.hobby);
    hobby = new char[len+1];
    std::strcpy(hobby, c.hobby);
    std::strcpy(name, c.name);
    return *this;
}
 
void Cow::ShowCow() const
{   std::cout << "Name: " << name << ", hobby: " << hobby << ", weight: " << weight << std::endl;           }
usecow.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include "cow.h"
 
int main()
{
    Cow a;
    a.ShowCow();
    Cow b("RED-cow", "gryuzet", 5);
    b.ShowCow();
 
    Cow * c = new Cow;
    c -> ShowCow();
    c ->~Cow();
    return 0;
}
А теперь вопросы:
1. Правильно ли я понимаю, что объекты a и b создаются в стеке? Под них специально не выделяется память, которую потом нужно удалять, память освобождается автоматически деструктором, который вызывается, когда объект больше не используется программой?
2. Если новый объект, например 'c', создается с помощью операции new, память для него выделяется динамически, и для него нужно явно вызвать деструктор класса?
3. Почему для объектов 'a' и 'b' используется точка в
C++
1
a.ShowCow();
, а для объекта 'c' используется -> ? Где почитать об этом?
Спасибо.))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.04.2017, 15:49
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Создание/удаление объектов класса (C++):

Построение описания класса, создание и уничтожение объектов этого класса
Построить описание класса, содержащего информацию о почтовом адресе...

Удаление объектов класса
Никак не могу понять, как правильно освободить память. Подскажите пожалуйста в...

Вставка и удаление объектов пользовательского класса в deque
Доброго времени суток! У меня есть контейнер хранящий объекты пользовательского...

Создание/удаление объектов
Здравствуйте. На сколько мне известно есть 2 способа создания объекта - с...

Создание и удаление объектов
Люди, прошу прошения за тупой вопрос, но что-то в гугле сходу не нашел. Вот,...

Создание объектов класса
class A{ A(string name){ } } int main(){ } Есть класс с...

1
MrGluck
Модератор
Эксперт CЭксперт С++
8022 / 4865 / 1425
Регистрация: 29.11.2010
Сообщений: 13,246
07.04.2017, 15:52 #2
Цитата Сообщение от mariellla Посмотреть сообщение
Правильно ли я понимаю, что объекты a и b создаются в стеке? Под них специально не выделяется память, которую потом нужно удалять, память освобождается автоматически деструктором, который вызывается, когда объект больше не используется программой?
Да. Но вот для свойства hobby память всё равно выделяется динамически (зачем-то).
Цитата Сообщение от mariellla Посмотреть сообщение
Если новый объект, например 'c', создается с помощью операции new, память для него выделяется динамически
Да.
Цитата Сообщение от mariellla Посмотреть сообщение
и для него нужно явно вызвать деструктор класса?
Нет. Нужно вызывать соответствующую версию оператора delete (а он уже сам вызовет деструктор).
Цитата Сообщение от mariellla Посмотреть сообщение
а для объекта 'c' используется ->
Это сокращение для операции (*obj). т.к. вы работает с указателем и предварительно нужно его разыменовать.
Цитата Сообщение от mariellla Посмотреть сообщение
Где почитать об этом?
В любой книге для начинающих.
http://www.cyberforum.ru/cpp-beginners/thread152353.html
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.04.2017, 15:52
Привет! Вот еще темы с решениями:

Создание Массива Объектов класса
Здравствуйте, такая вот проблемка возникла: нужно создать массив B объектов...

Создание массива объектов класса
Создание массива объектов класса. E2451 Undefined symbol 'myZKH' По-разному...

Создание класса абстрактных объектов
Добрый день/утро/вечер. Возник вопрос,скорее теоретического характера. Есть...

Создание массива объектов класса
Здравствуйте Подскажите пожалуйста как правилььно создать массив объектов...


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

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

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