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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 24, средняя оценка - 4.75
Buckstabue
 Аватар для Buckstabue
175 / 124 / 6
Регистрация: 12.01.2012
Сообщений: 624
16.05.2012, 23:52     Про конструктор копирования, оператор присваивания #1
Объясните, пожалуйста, принцип действия конструктора копирования и операции присваивания. На что указывает указатель this в этих функциях? На объект копирования или на объект текущего класса? Нужно копировать только динамическую память, статические данные копируются автоматом даже при переопределении?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.05.2012, 23:52     Про конструктор копирования, оператор присваивания
Посмотрите здесь:

C++ Конструктор присваивания или копирования
Конструктор копирования и оператор присваивания C++
Конструктор копий. Оператор присваивания C++
Очередь, конструктор копирования и перегруженный оператор присваивания C++
C++ Ребят, уже запарился, гляньте, что не так!? конструктор копирования и оператор присваивания
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Avazart
 Аватар для Avazart
6904 / 5144 / 253
Регистрация: 10.12.2010
Сообщений: 22,629
Записей в блоге: 17
17.05.2012, 00:08     Про конструктор копирования, оператор присваивания #2
this -указаель на объект текущего класса т.е тот который обычно слева от оператора.

Нужно копировать только динамическую память, статические данные копируются автоматом даже при переопределении?
Нужно все данные копировать ( если вы не хотите что-то потерять намеренно )
Buckstabue
 Аватар для Buckstabue
175 / 124 / 6
Регистрация: 12.01.2012
Сообщений: 624
17.05.2012, 00:21  [ТС]     Про конструктор копирования, оператор присваивания #3
Объясните, пожалуйста, тогда этот пример из википедии
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
class My_Array 
{
 
    int * array;
    int count;
 
public:
 
    My_Array & operator = (const My_Array & other)
    {
        if (this != &other) // защита от неправильного самоприсваивания
        {
            // 1: выделяем "новую" память и копируем элементы
            int * new_array = new int[other.count];
            std::copy(other.array, other.array + other.count, new_array);
 
            // 2: освобождаем "старую" память
            delete [] array;
 
            // 3: присваиваем значения в "новой" памяти объекту
            array = new_array;
            count = other.count;
        }
        // по соглашению всегда возвращаем *this
        return *this;
    }
 
    ...
 
};
Мне никак не понять, зачем на строчке 18 освобождается память под массив. Насколько это безопасно? До вызова оператора = случайно не вызывается конструктор копирования/просто конструктор?
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
17.05.2012, 00:25     Про конструктор копирования, оператор присваивания #4
Цитата Сообщение от Buckstabue Посмотреть сообщение
Мне никак не понять, зачем на строчке 18 освобождается память под массив
так понятно?
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
class My_Array 
{
 
    int * array;
    int count;
 
public:
    My_Array(int size)
    {
        array = new int[size];
        count = size;
    }
 
    My_Array & operator = (const My_Array & other)
    {
        if (this != &other) // защита от неправильного самоприсваивания
        {
            // 1: выделяем "новую" память и копируем элементы
            int * new_array = new int[other.count];
            std::copy(other.array, other.array + other.count, new_array);
 
            // 2: освобождаем "старую" память
            delete [] array;
 
            // 3: присваиваем значения в "новой" памяти объекту
            array = new_array;
            count = other.count;
        }
        // по соглашению всегда возвращаем *this
        return *this;
    }
 
    ...
 
};
Avazart
 Аватар для Avazart
6904 / 5144 / 253
Регистрация: 10.12.2010
Сообщений: 22,629
Записей в блоге: 17
17.05.2012, 00:30     Про конструктор копирования, оператор присваивания #5
Память под старый массив удаляется и выделяется новая память ( так как размеры исходного и присваеваемого массивов могут отличаться)
Buckstabue
 Аватар для Buckstabue
175 / 124 / 6
Регистрация: 12.01.2012
Сообщений: 624
17.05.2012, 00:31  [ТС]     Про конструктор копирования, оператор присваивания #6
Теперь более-менее понятно, а то раньше к висячему указателю применяли delete[] , что насколько я знаю, приводит к фатальной ошибке
Yandex
Объявления
17.05.2012, 00:31     Про конструктор копирования, оператор присваивания
Ответ Создать тему
Опции темы

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