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

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

Восстановить пароль Регистрация
 
Guy Kawasaki
 Аватар для Guy Kawasaki
2 / 1 / 0
Регистрация: 07.11.2013
Сообщений: 42
05.12.2013, 23:50     Конструктор копирования и оператор присваивания #1
Спасибо всем тем, кто заглянул на огонек.
Проблема: Реализовать конструктор копирования и оператор присваивания для класса 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++ Про конструктор копирования, оператор присваивания
Конструктор копий. Оператор присваивания C++
Очередь, конструктор копирования и перегруженный оператор присваивания C++
C++ Ребят, уже запарился, гляньте, что не так!? конструктор копирования и оператор присваивания
Конструктор копирования и перегрузка оператора присваивания C++
Конструктор копирования, присваивания C++

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

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

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