3 / 2 / 0
Регистрация: 07.11.2013
Сообщений: 42
1

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

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

Author24 — интернет-сервис помощи студентам
Спасибо всем тем, кто заглянул на огонек.
Проблема: Реализовать конструктор копирования и оператор присваивания для класса 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;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.12.2013, 23:50
Ответы с готовыми решениями:

Конструктор копирования и оператор присваивания
Есть класс (синтетический, создан для примера) class Object { private: int a; float...

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

Про конструктор копирования, оператор присваивания
Объясните, пожалуйста, принцип действия конструктора копирования и операции присваивания. На что...

Очередь, конструктор копирования и перегруженный оператор присваивания
#include &lt;iostream&gt; using namespace std; typedef char type; struct Node { type element;...

0
05.12.2013, 23:50
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.12.2013, 23:50
Помогаю со студенческими работами здесь

Конструктор копирования и оператор присваивания - общая часть, выделять ли в отдельный метод
Как лучше? // конструктор копирования Fraction::Fraction( const Fraction&amp; rhs ) { //...

Ребят, уже запарился, гляньте, что не так!? конструктор копирования и оператор присваивания
#include &lt;iostream&gt; using namespace std; struct SNode { SNode*next; int val; ...

Нужно ли реализовать также отдельно конструктор копирования, если имеется перегруженный оператор присваивания?
у меня есть класс. и прототип перегруженной операции присваивания some_class&amp;...

Конструктор копирования, присваивания
Пусть есть класс class some{ private : int a ; }; Перегрузить оператор &quot;=&quot; можно так ...


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

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

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