138 / 5 / 1
Регистрация: 25.03.2013
Сообщений: 228
1

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

31.03.2013, 12:59. Показов 3081. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Я сделал почти задание по перегрузке операторов. Осталось одно, тоесть три: конструктор инициализации, конструктор копирования, деструктор. Я толком нешарю зачем мне они, и без них все работает, но раз надо так надо. Напишите ети конструкторы к моему коду, а то я просто непомаю зачем их писать, и следовательно как их писать.
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 минуту
Ах да, етот код, ето класс рациональних чисел(обычной дроби), и перегруженые операторы +, -, *, /, < , >...
Ну, если ето так важно
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
31.03.2013, 12:59
Ответы с готовыми решениями:

Создать класс "Вектор" и реализовать конструктор по умолчанию, конструктор копирования и деструктор
Всем доброго времени суток! нужна ваша помощь! нужно создать класс вектор и реализовать...

Деструктор и конструктор копирования не работают
Если котротко, то проблему можнео описать в двух словах: не могу написать деструктор и конструктор...

Конструктор копирования, деструктор при наследовании
Есть класс A и производный от него B. Написать конструктор копирования, деструкторы для обоих...

Конструктор копирования при инициализации
При инициализации одного объекта через другой вызывается конструктор копирования, под динамическую...

9
137 / 131 / 57
Регистрация: 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(){} //деструктор //вызывается при удалении объекта класса. обычно используется для удаления динамически выделенной памяти
1
138 / 5 / 1
Регистрация: 25.03.2013
Сообщений: 228
31.03.2013, 13:32  [ТС] 3
Черный ворон, о, большое спасибо. А подскажете еще как правильно вызвать деструктор для обьекта?
0
15 / 15 / 5
Регистрация: 07.02.2013
Сообщений: 123
31.03.2013, 14:19 4
Цитата Сообщение от o33ik Посмотреть сообщение
Черный ворон, о, большое спасибо. А подскажете еще как правильно вызвать деструктор для обьекта?
Деструктор вызывать не нужно. Он вызывается автоматически, как и конструктор (это их главные особенности).
Деструктор вызывается когда объект выходит из области видимости. Т.е. завершается работа блока { } в котором находился этот объект.
Конструктор по умолчанию (void) вызывается при создании объекта. Classname obj; //вызов конструктора
Это обычные функции, но которые выполняются автоматически. Следовательно что в них впихнуть придумайте сами.
Конструкторы используют для начальной инициализации или выделение динам. памяти, а деструкторы для освобождения динамически выделенной памяти под поля класса.
1
4 / 4 / 3
Регистрация: 30.09.2012
Сообщений: 63
04.01.2014, 00:33 5
supra7sky, деструкторы не всегда вызываются автоматически.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
04.01.2014, 00:36 6
Цитата Сообщение от sashadereh Посмотреть сообщение
деструкторы не всегда вызываются автоматически.
Расскажите нам как обстоят дела на самом деле.
2
4 / 4 / 3
Регистрация: 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, когда объект становится не нужен.

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

Добавлено через 2 минуты
По-моему, тут два вопроса в куче: автоматически, неавтоматически, и явно, неявно.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
04.01.2014, 02:41 9
sashadereh, вижу, что Вы все понимаете. Однако supra7sky как раз говорил про вызов деструктора при выходе объекта из области видимости. А когда мы работаем с указателем и ручным выделением памяти через new, контроль перекладывается уже на плечи программиста. Но даже в этом случае явного вызова деструктора делать не стоит. Явный вызов может потребоваться только при использовании placement new.
Могу предположить, что Вы хотели сделать акцент на том, что C++ не имеет встроенного сборщика мусора, просто не совсем удачно выразились.
0
4 / 4 / 3
Регистрация: 30.09.2012
Сообщений: 63
04.01.2014, 23:36 10
Tulosba, именно, о чем и сожалею)
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.01.2014, 23:36
Помогаю со студенческими работами здесь

Конструктор копирования при инициализации в header файле
Добрый вечер, где можно почитать про данное поведение? #include &lt;iostream&gt; using namespace std; ...

Как написать конструкторы копирования, инициализации и конструктор без аргументов?
Как написать конструкторы копирования, инициализации и конструктор без аргументов? Вот код ...

Можно ли использовать конструктор по умолчанию и конструктор инициализации одновременно?
Можно ли использовать конструктор по умолчанию и конструктор инициализации одновременно?

Не могу сделать чтобы класс содержал основной конструктор и конструктор копирования
Разработать класс ThreeAngle для работы с плоскими треугольниками. В качестве членов-данных...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru