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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 24, средняя оценка - 4.75
Buckstabue
175 / 124 / 6
Регистрация: 12.01.2012
Сообщений: 624
#1

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

16.05.2012, 23:52. Просмотров 3401. Ответов 5
Метки нет (Все метки)

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

Конструктор копирования и оператор присваивания - C++
Не понимаю, когда используется один, а когда другой. Написал простой пример с комплексными числами - при компиляции в VS2010 и CodeBlock 10...

Очередь, конструктор копирования и перегруженный оператор присваивания - C++
#include <iostream> using namespace std; typedef char type; struct Node { type element; Node *pNext; };

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

Ребят, уже запарился, гляньте, что не так!? конструктор копирования и оператор присваивания - C++
#include <iostream> using namespace std; struct SNode { SNode*next; int val; SNode(){} SNode(SNode*...

Нужно ли реализовать также отдельно конструктор копирования, если имеется перегруженный оператор присваивания? - C++
у меня есть класс. и прототип перегруженной операции присваивания some_class& some_class::operator=(const some_class& some_object); ...

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

Конструктор присваивания или копирования - C++
Есть программа. В ней есть класс стэк. Нужно написать оператор копирования ИЛИ присваивания. Заранее спасибо. #include...

Конструктор копирования и операция присваивания в классе - C++
Народ, вот есть такие объявления(motto - объект класса StringBad): StringBad ditto(motto); StringBad metoo = motto; StringBad...

Конструктор копирования и перегрузка оператора присваивания - C++
Здравствуйте! Возникла следующая проблема: не могу перегрузить оператор присваивания и сделать конструктор копирования Имеется...

Конструктор копий. Оператор присваивания - C++
В классе есть массив char (не динамический) размером 40 байт. Вопрос1: нужно ли для такого класса определять конструктор копий или...

Оператор присваивания через конструктор - C++
Здравствуйте! Насколько плохо (или совсем не плохо) реализовывать операторы присваивания через соответствующие конструкторы с помощью...

Перемещающий конструктор и оператор перемещающего присваивания - C++
Правильно у меня написаны перемещающий конструктор и оператор присваивания? И исправьте ошибку в операторе "ссылка rvalue не может быть...


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Avazart
Эксперт С++
7115 / 5292 / 273
Регистрация: 10.12.2010
Сообщений: 23,380
Записей в блоге: 17
17.05.2012, 00:08     Про конструктор копирования, оператор присваивания #2
this -указаель на объект текущего класса т.е тот который обычно слева от оператора.

Нужно копировать только динамическую память, статические данные копируются автоматом даже при переопределении?
Нужно все данные копировать ( если вы не хотите что-то потерять намеренно )
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
Каратель
Эксперт С++
6553 / 3973 / 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
Эксперт С++
7115 / 5292 / 273
Регистрация: 10.12.2010
Сообщений: 23,380
Записей в блоге: 17
17.05.2012, 00:30     Про конструктор копирования, оператор присваивания #5
Память под старый массив удаляется и выделяется новая память ( так как размеры исходного и присваеваемого массивов могут отличаться)
Buckstabue
175 / 124 / 6
Регистрация: 12.01.2012
Сообщений: 624
17.05.2012, 00:31  [ТС]     Про конструктор копирования, оператор присваивания #6
Теперь более-менее понятно, а то раньше к висячему указателю применяли delete[] , что насколько я знаю, приводит к фатальной ошибке
Yandex
Объявления
17.05.2012, 00:31     Про конструктор копирования, оператор присваивания
Ответ Создать тему
Опции темы

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