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

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

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

Author24 — интернет-сервис помощи студентам
Я сделал почти задание по перегрузке операторов. Осталось одно, тоесть три: конструктор инициализации, конструктор копирования, деструктор. Я толком нешарю зачем мне они, и без них все работает, но раз надо так надо. Напишите ети конструкторы к моему коду, а то я просто непомаю зачем их писать, и следовательно как их писать.
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
31.03.2013, 12:59
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
31.03.2013, 12:59
Ответы с готовыми решениями:

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

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

Конструктор копирования, деструктор при наследовании
Есть класс A и производный от него B. Написать конструктор копирования, деструкторы для обоих классов. class A { public: int *a; ...

9
139 / 133 / 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
 Аватар для supra7sky
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
5499 / 4894 / 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
04.01.2014, 23:36
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.01.2014, 23:36
Помогаю со студенческими работами здесь

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

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

Как написать конструкторы копирования, инициализации и конструктор без аргументов?
Как написать конструкторы копирования, инициализации и конструктор без аргументов? Вот код #include &lt;iostream&gt; using...

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

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


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

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

Редактор формул (кликните на картинку в правом углу, чтобы закрыть)
Опции темы

Новые блоги и статьи
Условные типы в TypeScript
stackOverflow 17.02.2025
Условные типы - это сильное средство TypeScript, позволяющее создавать типы, которые могут менять свое поведение в зависимости от определенных условий. По своей сути, они работают подобно тернарному. . .
TypeScript и оператор infer: разбиваем Composite-типы на части
stackOverflow 17.02.2025
В TypeScript композитные типы занимают особое место - это сложные типы данных, которые создаются путем объединения более простых типов. К ним относятся массивы, объекты, кортежи (tuples),. . .
Mapped-типы в TypeScript
stackOverflow 17.02.2025
TypeScript предоставляет развитые средства для типизации данных, и одним из наиболее гибких инструментов являются mapped-типы. По сути, mapped-тип или сопоставленный тип - это способ создания нового. . .
Как вернуть энтузиазм
Uswer 17.02.2025
Приветствую тебя читатель. Сначала небольшая предыстория. Лет 5-6 тому назад появилась у меня идея автоматизации некоего процесса на работе. А так как я уже много лет увлекаюсь (не путать с. . .
Оператор satisfies в TypeScript: как он работает и где применять
stackOverflow 17.02.2025
Оператор satisfies - одна из наиболее полезных возможностей TypeScript, позволяющая проверять типы значений без изменения их исходного типа. В отличие от других операторов типизации, satisfies дает. . .
Почему могут не шифроваться русские символы в Java
Wired 17.02.2025
При разработке на Java нередко возникают сложности с шифрованием русских символов. Эта проблема особенно актуальна для разработчиков, создающих программное обеспечение для русскоязычной аудитории. . . .
Отличия ОС для x86_64 и ARM
Wired 17.02.2025
На данный момент сосуществуют две основные архитектуры процессоров - x86_64 и ARM. Эти архитектуры имеют принципиально разные подходы к организации вычислений и обработке данных, что накладывает. . .
Многопоточность в Python: как использовать Thread
bytestream 17.02.2025
Поток выполнения (thread) - это наименьшая последовательность инструкций, которая может управляться планировщиком операционной системы. Представьте себе, что ваша программа - это книга, а потоки -. . .
Как воспроизвести Race Condition в Python
bytestream 17.02.2025
В многопоточном программировании существует множество подводных камней, и одним из самых коварных является состояние гонки (Race Condition). Этот термин описывает ситуацию, когда результат выполнения. . .
Ошибка "node: --openssl-legacy-provider is not allowed in NODE_OPTIONS"
bytestream 17.02.2025
Каждый разработчик рано или поздно сталкивается с ситуацией, когда при запуске проекта Node. js неожиданно выскакивает ошибка "node: --openssl-legacy-provider is not allowed in NODE_OPTIONS". Это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru