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

Насчет оператора присваивания - C++

Восстановить пароль Регистрация
 
mzarb
-211 / 7 / 1
Регистрация: 14.01.2013
Сообщений: 141
19.01.2013, 16:01     Насчет оператора присваивания #1
Есть следующий код :
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
#include <iostream> 
using namespace std;
 
class Array {
private:
    size_t mysize;
    int *mydata;
public:
    Array(size_t size);
    void operator=(Array a);
    void set(int i, int val);
    int get(int i);
};
 
Array::Array(size_t size){
    mysize = size;
    mydata = new int [mysize];
}
 
void Array::operator=(Array a){
    mysize = a.mysize;
    delete [] mydata;
    mydata = new int [mysize];
    for(int i=0;i<mysize;i++)
        mydata[i] = a.mydata[i];
}
 
void Array::set(int i, int val){
    mydata[i] = val;
}
 
int Array::get(int i){
    return mydata[i];
}
 
int main() {
    setlocale(LC_CTYPE, "Russian");
    
    Array a(10);
    a.set(0,115);
    Array b(20);
    b=a;
    cout << a.get(0);
    system("pause");
        return 0;
}
То есть при выполнении этой операции b=a; или b.operator=(a) будет вызван метод класса operator=(), в объявлении которого указан параметр принимающий по значению, то есть будет копироваться объект с помощью конструктора копий. Это верно? Ну а если "b = a" - это синтаксический сахар от b.operator=(a), то касается ли это такого кода :
C++
1
2
3
int x = 10;
 int y = 20;
 y = x;
Ведь работать будет и такой :
C++
1
2
3
int x(10);
int y(20);
y = x;
Или такой :
C++
1
2
int x(10);
int y(x);
Я так понимаю, что во всех трех случаях запускается конструктор копий, тогда получается что int - это не просто что-то, а класс int, то есть int(класс) x(объект). Если все так, то конечно странно, что в начале книги я не видел этого, а думал что int - это что-то другое, но точно не класс. С одной стороны логично не рассматривать этот момент до того как будут затронуты классы, но хотя бы пометку из пары слов следовало бы оставить и сказать, что это класс, но разъяснения будут после ознакомления с объектно-ориентированным программированием.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
19.01.2013, 16:07     Насчет оператора присваивания #2
лучше оперировать словом тип, а не класс.
инт - это встроенный тип.
класс - это тип, определенный пользователем.
поэтому общее у них не то, что они классы, а типы.
ну и для разных типов есть набор общих свойств\правил и набор специфичных.
Igor3D
793 / 410 / 33
Регистрация: 01.10.2012
Сообщений: 2,071
19.01.2013, 16:19     Насчет оператора присваивания #3
Цитата Сообщение от mzarb Посмотреть сообщение
C++
1
    void operator=(Array a);
Так не надо. Правильно так
C++
1
void operator=(const Array & a);
Также конструктор копирования должен быть определен, т.к. создаваемый по умолчанию не годится. То же и для деструктора
mzarb
-211 / 7 / 1
Регистрация: 14.01.2013
Сообщений: 141
19.01.2013, 17:09  [ТС]     Насчет оператора присваивания #4
DU, а как с этим встроенными типами можно работать , то есть как выглядят их классы и реализация методов? Где это можно посмотреть?

Добавлено через 10 минут
Igor3D, да, вы правы, даже если мне нужна копия объекта и для этого указываю передачу по значению в методе operator=(), то все ровно нужно определять конструктор копирования с ещё одним выделением массива и копированием в него, что бы не было утечки памяти, так что ссылки проще, так как в них можно сразу нужное сделать и не нужно ничего копировать. Но я написал этот способ с передачей по значению только чтобы прокомментировать его и чтобы кто-то подтвердил правильность понимания мной порядка выполняемых действий. Но все ровно спасибо, так как я мог и не знать об этом.
Yandex
Объявления
19.01.2013, 17:09     Насчет оператора присваивания
Ответ Создать тему
Опции темы

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