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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Guy Kawasaki
2 / 1 / 0
Регистрация: 07.11.2013
Сообщений: 42
#1

Конструктор копирования и оператор присваивания - C++

05.12.2013, 23:50. Просмотров 230. Ответов 0
Метки нет (Все метки)

Спасибо всем тем, кто заглянул на огонек.
Проблема: Реализовать конструктор копирования и оператор присваивания для класса User.
Вопрос: В чем разница между конструктором копирования и оператором присваивания?

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
#ifndef MYSKYPE_H
#define MYSKYPE_H
#include <string>
 
using namespace std;
 
class User
{
private:
        int id, friend_number, ban_number;
        string nickname, password, email;
        User *friend_list, *ban_list;
public:
        User();
        User(int identifier, int numF, int numB, string nick, string pasw, string mail, User *frd, User *ban);
        User(const User &user_copy);
        User &operator = (const User &original);
        ~User();
 
        int get_id();
        int get_friend_number();
        int get_ban_number();
        string get_nick();
        string get_pasw();
        string get_mail();
 
        void put_id(int identifier);
        void put_friend_number(int numF);
        void put_ban_number(int numB);
        void put_nick(string name);
        void put_pasw(string psw);
        void put_mail(string mail);
        //void friend_list_null();
        //void ban_list_null();
};
#endif
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
#include "myskype.h"
#include <string>
#include <iostream>
 
using namespace std;
 
User::User():
    id(0),
    friend_number(0),
    ban_number(0),
    nickname("unknown"),
    password("unknown"),
    email("unknown"),
    friend_list(0),
    ban_list(0)
{}
 
User::User(int identifier, int numF, int numB, string nick, string pasw, string mail, User *frd, User *ban):
    id(identifier),
    friend_number(numF),
    ban_number(numB),
    nickname(nick),
    password(pasw),
    email(mail)
{
    friend_list = new User[numF];
    for(int i = 0; i < numF; ++i)
        friend_list[i] = frd[i];
 
    ban_list = new User[numB];
    for(int i = 0; i < numB; ++i)
        ban_list[i] = ban[i];
}
 
User& User::operator = (const User &original)
    //id(original.id),
    //friend_number(original.friend_number),
    //ban_number(original.ban_number),
    //nickname(original.nickname),
    //password(original.password),
    //email(original.email)
{
    if (this != &original) // Защита от неправильного самоприсваивания
    {
        User new_friend_list = new User[friend_number];
        for(int i = 0; i < friend_number; ++i)
            original.friend_list[i] = friend_list[i];
 
        delete []friend_list; // Освобождаем старую память
 
        User new_ban_list = new User[original.ban_number];
        for(int i = 0; i < original.ban_number; ++i)
            original.ban_list[i] = ban_list[i];
 
        delete []ban_list;
 
        friend_list = new_friend_list; // Присваиваем значения в "новой" памяти объекту
        ban_list = new_ban_list;
    }
    return *this; // По соглашению всегда возвращаем *this
}
 
/*
void User::friend_list_null()
{
    if(friend_list == 0);
    else
    {
        for(int i = 0; i < friend_number; ++i)
            friend_list[i] = 0;
    }
}
 
void User::ban_list_null()
{
    if(ban_list == 0);
    else
    {
        for(int i = 0; i < ban_number; ++i)
            ban_list[i] = 0;
    }
}
*/
 
User::~User()
{
    //friend_list_null();
    delete []friend_list;
        friend_list = 0;
 
    //ban_list_null();
    delete []ban_list;
        ban_list = 0;
}
 
int User::get_id()
{
    return id;
}
 
int User::get_friend_number()
{
    return friend_number;
}
 
int User::get_ban_number()
{
    return ban_number;
}
 
string User::get_nick()
{
    return nickname;
}
 
string User::get_pasw()
{
    return password;
}
 
string User::get_mail()
{
    return email;
}
 
void User::put_id(int identifier)
{
    id = identifier;
}
 
void User::put_friend_number(int numF)
{
    friend_number = numF;
}
 
void User::put_ban_number(int numB)
{
    ban_number = numB;
}
 
void User::put_nick(string name)
{
    nickname = name;
}
 
void User::put_pasw(string psw)
{
    password = psw;
}
 
void User::put_mail(string mail)
{
    email = mail;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.12.2013, 23:50     Конструктор копирования и оператор присваивания
Посмотрите здесь:

оператор = и конструктор копирования - C++
Всем привет. Дана задача: создать класс книга с полями автор,название,год выпуска книги. С помощью односвязного списка создать класс...

При удалении объектов происходит порча кучи. Конструктор копирования и оператор = переопределены - C++
Всем добрый день, возникла небольшая проблема, может кто-то подскажет, что происходит? Бьюсь уже четвёртые сутки, не могу понять, где...

Оператор присваивания - C++
Добрый день! Помогите, пожалуйста, разобраться. Я не совсем понимаю работу перегруженного оператора присваивания в классе String, который...

Оператор присваивания - C++
Какая разница между оператором &quot;=&quot; и &quot;==&quot; Почему , например , в цикле нужно писать while(count==1) а не ...

Оператор присваивания - C++
Почему в этом случае вызывается оператор присваивания Fraction f4; f4 = f1+f2+f3; а в другом не вызывается: ...

Оператор присваивания в c++ - C++
Такой вопрос, для каких классов следует явно перегрузить оператор присваивания??

Оператор присваивания и деструктор - C++
Вопрос: почему в 52 строке Access violation? Если убрать строку 50, все будет нормально. #include &lt;iostream&gt; using namespace std; ...

Оператор присваивания по умолчанию - C++
#include &lt;iostream&gt; using namespace std; class Foo { private: int var; //int var = 17; public: /*Foo&amp;...

Логическая переменная и оператор присваивания - C++
С помощью логической переменной и оператора присваивания определить: 1-я цифра у 3-хзначного числа больше 3-й цифры.

Оператор присваивания для массива - C++
Есть шаблонный класс который служит контейнером для различных типов c помощью массива. Как получить значение конкретного индекса нашел,...


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

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