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

Материал из Seo Wiki - Поисковая Оптимизация и Программирование
Перейти к навигацииПерейти к поиску

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

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

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

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

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

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

  1. Получаем новые ресурсы
  2. Освобождаем старые ресурсы
  3. Присваиваем объекту значения нового ресурса

<source lang="cpp"> 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;
   }
   ...

}; </source>

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

<source lang="cpp"> 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 уничтожается, освобождая память
   }

</source>

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

<source lang="cpp"> array_1 = array_2 = array_3; // значение array_3 присваивается array_2

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

</source>

Смотри также

Ссылки

  1. Bjarne Stroustrup The C++ Programming Language. — 3. — Addison-Wesley. — P. 244. — ISBN 978-0201700732
  2. Sutter, H. & Alexandrescu (October 2004), [{{Expansion depth limit exceeded|{{Expansion depth limit exceeded|{{Expansion depth limit exceeded|{{{Expansion depth limit exceeded}}} |{{Expansion depth limit exceeded|http://dx.doi.org/{{Expansion depth limit exceeded}} |{{Expansion depth limit exceeded| http://www.ncbi.nlm.nih.gov/pubmed/{{Expansion depth limit exceeded}} }} }} }} }} |{{Expansion depth limit exceeded|{{{Expansion depth limit exceeded}}} |{{Expansion depth limit exceeded|http://dx.doi.org/{{Expansion depth limit exceeded}} |{{Expansion depth limit exceeded| http://www.ncbi.nlm.nih.gov/pubmed/{{Expansion depth limit exceeded}} }} }} }} }} {{{Expansion depth limit exceeded}}}], Addison-Wesley, {{Expansion depth limit exceeded|pp. {{{Expansion depth limit exceeded}}} | }}, ISBN 0-321-11358-6 

en:Assignment operator in C++ zh:C++設定運算子

Если вам нравится SbUP.com Сайт, вы можете поддержать его - BTC: bc1qppjcl3c2cyjazy6lepmrv3fh6ke9mxs7zpfky0 , TRC20 и ещё....