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

Конструктор инициализации, конструктор копирования, деструктор - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.82
o33ik
138 / 5 / 1
Регистрация: 25.03.2013
Сообщений: 228
31.03.2013, 12:59     Конструктор инициализации, конструктор копирования, деструктор #1
Я сделал почти задание по перегрузке операторов. Осталось одно, тоесть три: конструктор инициализации, конструктор копирования, деструктор. Я толком нешарю зачем мне они, и без них все работает, но раз надо так надо. Напишите ети конструкторы к моему коду, а то я просто непомаю зачем их писать, и следовательно как их писать.
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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
#include <iostream>
#include <conio.h>
#include <string.h>
using namespace std;
 
class RD
{
    int c;
    int z;
    public:
    friend int gcd(RD);
    friend RD skorot(RD);
    friend bool zero(RD);
 
    void input()
    {
        cout << "Enter nominator: ";
        cin >> c;
        cout << "Enter denominator: ";
        cin >> z;
    }
 
    RD operator+(RD);
    RD operator-(RD);
    RD operator*(RD);
    RD operator/(RD);
    bool operator>(RD);
    bool operator<(RD);
    bool operator>=(RD);
    bool operator<=(RD);
    bool operator==(RD);
    bool operator!=(RD);
    void operator<<(RD);
 
    void print()
    {
        cout << c << "/" << z << endl;
    }
};
 
RD RD::operator+(RD drib2)
{
    RD res;
    res.c = c*drib2.z + drib2.c*z;
    res.z = z * drib2.z;
    return skorot(res);
}
 
RD RD::operator-(RD drib2)
{
    RD res;
    res.c = c*drib2.z - drib2.c*z;
    res.z = z * drib2.z;
    return skorot(res);
}
 
RD RD::operator*(RD drib2)
{
    RD res; 
    res.c = c * drib2.c; 
    res.z = z * drib2.z;
    return skorot(res);
}
 
RD RD::operator/(RD drib2)
{
    RD res;
    res.c = c * drib2.z; res.z = z * drib2.c;
    return skorot(res);
}
 
bool RD::operator>(RD drib2)
{
    bool I;
    if (c*drib2.z > drib2.c*z)
        I = true;
    else
        I=false;
     return I;
}
 
bool RD::operator<(RD drib2)
{
    bool I;
    if (c*drib2.z < drib2.c*z)
        I = true;
    else
        I=false;
     return I;
}
 
bool RD::operator>=(RD drib2)
{
    bool I;
    if (c*drib2.z >= drib2.c*z)
        I = true;
    else
        I=false;
     return I;
}
 
bool RD::operator<=(RD drib2)
{
    bool I;
    if (c*drib2.z <= drib2.c*z)
        I = true;
    else
        I=false;
     return I;
}
 
bool RD::operator==(RD drib2)
{
    bool I;
    if (c*drib2.z == drib2.c*z)
        I = true;
    else
        I=false;
     return I;
}
 
bool RD::operator!=(RD drib2)
{
    bool I;
    if (c*drib2.z != drib2.c*z)
        I = true;
    else
        I=false;
     return I;
}
 
 
int gcd(RD drib)
{
  while(drib.z) drib.z^=drib.c^=drib.z^=drib.c%=drib.z;
  int C=drib.c;
  return C;
 }
 
RD skorot(RD drib)
{
    int NOD = gcd(drib);
    drib.c = drib.c / NOD;
    drib.z = drib.z / NOD;
    return drib;
}
 
bool zero(RD drib)
{
    bool i=true;
    if (drib.z==0)
    {
        cout << "Denominator can not be zero!" << endl;
        system("pause");
        system("cls");
        i=false;
    }
    return i;
}
 
void print(RD res)
{
    cout << "Result: ";
    res.print();
}
;
 
void oper(RD a, RD b, char* key)
{
    RD RES;
            if(strcmp(key, "+")==0)
            {
                RES = a + b; 
                print(RES);
            }
        if(strcmp(key, "-")==0)
            {
                RES = a - b; 
                print(RES);
            }
        if(strcmp(key, "*")==0)
            {
                RES = a * b; 
                print(RES);
            }
        if(strcmp(key, "/")==0)
            {
                RES = a / b; 
                print(RES);
            }
        if(strcmp(key, ">")==0)
            {
                if (a > b)
                    cout << "YES";
                else
                    cout << "NO";
            }
        if(strcmp(key, "<")==0)
            {
                if (a < b)
                    cout << "YES";
                else
                    cout << "NO";
            }
        if(strcmp(key, ">=")==0)
            {
                if (a >= b)
                    cout << "YES";
                else
                    cout << "NO";
            }
        if(strcmp(key, "<=")==0)
            {
                if (a <= b)
                    cout << "YES";
                else
                    cout << "NO";
            }
        if(strcmp(key, "==")==0)
            {
                if (a == b)
                    cout << "YES";
                else
                    cout << "NO";
            }
        if(strcmp(key, "!=")==0)
            {
                if (a != b)
                    cout << "YES";
                else
                    cout << "NO";
            }
};
 
void main()
{
    char key[3];
    RD a, b;
    while(true)
    {
        a.input();
        zero(a);
        if (zero(a)==false)
            continue;
        cin >> key;
        b.input();
        if (zero(b)==false)
            continue;
        oper(a,b,key);
        cout << endl;
        system("pause");
        system("cls");
    }
    getch();
}
Добавлено через 1 минуту
Ах да, етот код, ето класс рациональних чисел(обычной дроби), и перегруженые операторы +, -, *, /, < , >...
Ну, если ето так важно
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.03.2013, 12:59     Конструктор инициализации, конструктор копирования, деструктор
Посмотрите здесь:

создать класс вектор и реализовать конструктор по умолчанию, копирования и деструктор C++
Конструктор копирования, деструктор при наследовании C++
C++ Не могу сделать чтобы класс содержал основной конструктор и конструктор копирования
C++ Не могу правильно сделать конструктор и конструктор копирования и принадлежность точки с заданными координатами треугольнику
Конструктор/деструктор C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Черный ворон
129 / 123 / 6
Регистрация: 31.01.2012
Сообщений: 435
31.03.2013, 13:19     Конструктор инициализации, конструктор копирования, деструктор #2
C++
1
2
3
4
5
RD::RD(void){c=z=0;} //конструктор с нулевым числом параметров вызовется в таком случае объявления: RD a;
RD::RD(int a, int b){c=a; z=b;} //с двумя параметрами// RD a(1,2); // одна вторая
RD::RD(int a){c=a; z=1;} //с одним параметром //RD a(2); // целое число 2
RD::RD(RD& t){c=t.c; z=t.z;} //копирующий конструктор //RD a(1,2), b=a;
RD::~RD(){} //деструктор //вызывается при удалении объекта класса. обычно используется для удаления динамически выделенной памяти
o33ik
138 / 5 / 1
Регистрация: 25.03.2013
Сообщений: 228
31.03.2013, 13:32  [ТС]     Конструктор инициализации, конструктор копирования, деструктор #3
Черный ворон, о, большое спасибо. А подскажете еще как правильно вызвать деструктор для обьекта?
supra7sky
 Аватар для supra7sky
15 / 15 / 1
Регистрация: 07.02.2013
Сообщений: 123
31.03.2013, 14:19     Конструктор инициализации, конструктор копирования, деструктор #4
Цитата Сообщение от o33ik Посмотреть сообщение
Черный ворон, о, большое спасибо. А подскажете еще как правильно вызвать деструктор для обьекта?
Деструктор вызывать не нужно. Он вызывается автоматически, как и конструктор (это их главные особенности).
Деструктор вызывается когда объект выходит из области видимости. Т.е. завершается работа блока { } в котором находился этот объект.
Конструктор по умолчанию (void) вызывается при создании объекта. Classname obj; //вызов конструктора
Это обычные функции, но которые выполняются автоматически. Следовательно что в них впихнуть придумайте сами.
Конструкторы используют для начальной инициализации или выделение динам. памяти, а деструкторы для освобождения динамически выделенной памяти под поля класса.
sashadereh
3 / 3 / 1
Регистрация: 30.09.2012
Сообщений: 63
04.01.2014, 00:33     Конструктор инициализации, конструктор копирования, деструктор #5
supra7sky, деструкторы не всегда вызываются автоматически.
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
04.01.2014, 00:36     Конструктор инициализации, конструктор копирования, деструктор #6
Цитата Сообщение от sashadereh Посмотреть сообщение
деструкторы не всегда вызываются автоматически.
Расскажите нам как обстоят дела на самом деле.
sashadereh
3 / 3 / 1
Регистрация: 30.09.2012
Сообщений: 63
04.01.2014, 02:14     Конструктор инициализации, конструктор копирования, деструктор #7
supra7sky, Tulosba, пардон, возможно не правильно выразился. Да, действительно, нам нет нужды вызывать деструкторы явным образом
C++
1
obj.~myclass();
потому как компилятор вызывает их неявно.

Но в этом случае:
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
class A
{
public:
    A()
    {
        std::cout<<"\nConstructor\n";
 
        arr = new double[100];
    }
    ~A() 
    {
        std::cout<<"\nDestructor\n";
 
        delete[] arr;
    }
private:
    double *arr;
};
 
int main(int argc, char **argv)
{
    A a;
 
    return 0;
}
красиво будет сказать, что деструктор будет вызван автоматически, а в этом:
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
class A
{
public:
    A()
    {
        std::cout<<"\nConstructor\n";
 
        arr = new double[100];
    }
    ~A() 
    {
        std::cout<<"\nDestructor\n";
 
        delete[] arr;
    }
private:
    double *arr;
};
 
int main(int argc, char **argv)
{
    A *a = new A;
 
    return 0;
}
так сказать будет некрасиво, потому как деструктор в этом конкретном случае вызван не будет. Да, изменив main
C++
1
2
3
4
5
6
7
8
int main(int argc, char **argv)
{
    A *a = new A;
 
        delete a;
 
    return 0;
}
мы решим проблему утечки памяти. Опять же, теоретически, деструктор вызван "автоматически", потому как так
C++
1
a.~A();
мы не писали, но практически, думаю понятно, что в случае динамического выделеления мы обязаны (умные указатели, само собой, в данном контексте не рассматриваем) "вызывать" деструкторы неявным образом с помощью delete, когда объект становится не нужен.

Я понимаю, что велосипед здесь не изобрел - это основы, но боюсь остаться не понятым.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
04.01.2014, 02:35     Конструктор инициализации, конструктор копирования, деструктор #8
Цитата Сообщение от sashadereh Посмотреть сообщение
Опять же, теоретически, деструктор вызван "автоматически"
А практически?

Добавлено через 2 минуты
По-моему, тут два вопроса в куче: автоматически, неавтоматически, и явно, неявно.
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
04.01.2014, 02:41     Конструктор инициализации, конструктор копирования, деструктор #9
sashadereh, вижу, что Вы все понимаете. Однако supra7sky как раз говорил про вызов деструктора при выходе объекта из области видимости. А когда мы работаем с указателем и ручным выделением памяти через new, контроль перекладывается уже на плечи программиста. Но даже в этом случае явного вызова деструктора делать не стоит. Явный вызов может потребоваться только при использовании placement new.
Могу предположить, что Вы хотели сделать акцент на том, что C++ не имеет встроенного сборщика мусора, просто не совсем удачно выразились.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.01.2014, 23:36     Конструктор инициализации, конструктор копирования, деструктор
Еще ссылки по теме:

Как написать конструкторы копирования, инициализации и конструктор без аргументов? C++
Конструктор копирования при инициализации в header файле C++
Деструктор и конструктор копирования не работают C++

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

Или воспользуйтесь поиском по форуму:
sashadereh
3 / 3 / 1
Регистрация: 30.09.2012
Сообщений: 63
04.01.2014, 23:36     Конструктор инициализации, конструктор копирования, деструктор #10
Tulosba, именно, о чем и сожалею)
Yandex
Объявления
04.01.2014, 23:36     Конструктор инициализации, конструктор копирования, деструктор
Ответ Создать тему
Опции темы

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