Операция присваивания в С++

Операция присваивания в С++

Операция присваивания в языке программирования C++ обозначается знаком '='. Как и другие операторы в C++, она может быть перегружена.

Операция присваивания копированием - особый вид операции присваивания, используемый для присваивания объектов одного класса друг другу. Является одним из особых членов-функций и генерируется автоматически компилятором в случае, если нет явного объявления программистом. Код, сгенерированный компилятором, выполняет поверхностное копирование.

Операция присваивания копированием отличается от конструктора копирования тем, что должен очищать члены-данные цели присваивания (и правильно обрабатывать самоприсваивание), тогда как конструктор копирования присваивает значения неинициализированным членам-данным.[1] Например:

My_Array first;           // инициализация конструктором по умолчанию
My_Array second = first;  // инициализация конструктором копирования
second = first;           // присваивание операцией присваивания копированием

Перегрузка операции присваивания копированием

Когда нужно сделать глубокие копии объектов необходимо также принять во внимание и обработку исключений. Одним из способов избежать ошибки перемещения ресурсов является следующий:

  1. Получаем новые ресурсы
  2. Освобождаем старые ресурсы
  3. Присваиваем объекту значения нового ресурса
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;
    }
 
    ...
 
};

Тем не менее, если успешный метод обмена доступен для всех членов и класс реализует конструктор копирования и деструктор (согласно Правилу трех), самым коротким путем реализации присваивание копированием будет следующий способ[2]:

public:
 
    void swap(My_Array & other) // обмен члена-функции (неудачи быть не должно!)
    {
        // обмен всех членов (и базовых субобъектов, если возможно) с other
        std::swap(array, other.array);
        std::swap(count, other.count);
    }
 
    My_Array & operator = (My_Array other) // Примечание: аргумент передается по значению!
    {
        // обмен this с other
        swap(other);
 
        // по соглашению всегда возвращаем *this
        return *this;
 
        // other уничтожается, освобождая память
    }

Причина, по которой операция = возвращает My_Array& вместо void, проста. Он разрешен для объединения назначений, как например:

array_1 = array_2 = array_3; // значение array_3 присваивается array_2 
                             // затем значение array_2 присваивается array_1

Смотри также

Ссылки

  1. Stroustrup Bjarne The C++ Programming Language. — 3. — Addison-Wesley. — P. 244. — ISBN 978-0201700732
  2. Sutter, H. & Alexandrescu, A. (October 2004), «C++ Coding Standards», Addison-Wesley, ISBN 0-321-11358-6 

Wikimedia Foundation. 2010.

Игры ⚽ Поможем сделать НИР

Полезное


Смотреть что такое "Операция присваивания в С++" в других словарях:

  • Оператор присваивания в C++ — Операция присваивания в языке программирования C++ обозначается знаком = . Как и другие операции в C++, она может быть перегружена. Операция присваивания копированием особый вид операции присваивания, используемый для присваивания объектов одного …   Википедия

  • Присваивание — Присваивание  механизм в программировании, позволяющий динамически изменять связи объектов данных (как правило, переменных) с их значениями. Строго говоря, изменение значений является побочным эффектом операции присвоения, и во многих… …   Википедия

  • Присваивание (программирование) — Содержание 1 Определение присваивания 1.1 Алгоритм работы оператора присваивания …   Википедия

  • Присвоение (программирование) — Содержание 1 Определение присваивания 1.1 Алгоритм работы оператора присваивания …   Википедия

  • C++ — У этого термина существуют и другие значения, см. C. См. также: Си (язык программирования) C++ Семантика: мультипарадигмальный: объектно ориентированное, обобщённое, процедурное, метапрограммирование Тип исполнения: компилируемый Появился в …   Википедия

  • С++ — См. также: Си (язык программирования) C++ Семантика: мультипарадигмальный: объектно ориентированное, обобщённое, процедурное, метапрограммирование Тип исполнения: компилируемый Появился в: 1985 г. Автор(ы): Бьёрн Страуструп …   Википедия

  • Равно — Знак равенства (=) в математике, в логике и других точных науках пишут между двумя идентичными по своему значению выражениями. В античной и средневековой математике равенство обозначалось словесно (например est egale). Декарт в XVII веке вместо… …   Википедия

  • Ruby — Класс языка: мультипарадигмальный: динамический, объектно ориентиров …   Википедия

  • Руби IDE — Ruby Семантика: мультипарадигмальный Тип исполнения: интерпретатор Появился в: 1995 г. Автор(ы): Юкихиро Мацумото Последняя версия: 1.9.1 …   Википедия

  • Рубин (язык программирования) — Ruby Семантика: мультипарадигмальный Тип исполнения: интерпретатор Появился в: 1995 г. Автор(ы): Юкихиро Мацумото Последняя версия: 1.9.1 …   Википедия


Поделиться ссылкой на выделенное

Прямая ссылка:
Нажмите правой клавишей мыши и выберите «Копировать ссылку»