Специальные функции-члены - Special member functions

Специальные функции-члены[1] в C ++ являются функциями, которые компилятор будут автоматически сгенерированы, если они используются, но не объявлены явно программистом. Автоматически сгенерированные специальные функции-члены:

Если объявлен деструктор, создание конструктора копирования устарело (C ++ 11, предложение N3242 [2]).
  • Конструктор перемещения если нет конструктора копирования, явно объявляются оператор присваивания копии, оператор присваивания перемещения и деструктор.
  • Оператор присваивания копий если явно не объявлены конструктор перемещения и оператор присваивания перемещения.
Если объявлен деструктор, создание оператора присваивания копии не рекомендуется.

В этих случаях версии этих функций, созданные компилятором, выполняют по членству операция. Например, деструктор, созданный компилятором, уничтожит каждый подобъект (базовый класс или член) объекта.

Функции, созданные компилятором, будут общественный, не-виртуальный[3] а конструктор копирования и операторы присваивания получат const & параметры (а не альтернативные правовые формы ).

пример

В следующем примере изображены два класса: Явный для которого явно объявлены все специальные функции-члены и Неявный для которых ничего не заявлено.

#включают <iostream>#включают <string>#включают <utility>класс Явный { общественный:  Явный() { стандартное::cout << «Конструктор по умолчанию» << сообщение_ << ''; }  явный Явный(стандартное::строка сообщение) : сообщение_(стандартное::шаг(сообщение)) {    стандартное::cout << «Конструктор не по умолчанию» << сообщение_ << '';  }  Явный(const Явный& Другой) {    стандартное::cout << «Копировать конструктор» << сообщение_ << '';    *этот = Другой;  // вызываем оператор присваивания копии  }  Явный& оператор=(const Явный& Другой) {    стандартное::cout << «Копировать оператор присваивания» << сообщение_ << '';    если (этот != &Другой) {      сообщение_ = Другой.сообщение_;    }    вернуть *этот;  }  Явный(Явный&& Другой) нет кроме {    стандартное::cout << «Переместить конструктор» << сообщение_ << '';    *этот = стандартное::шаг(Другой);  // вызываем оператор присваивания перемещения  }  Явный& оператор=(Явный&& Другой) нет кроме {    стандартное::cout << «Переместить оператор присваивания» << сообщение_ << '';    если (этот != &Другой) {      сообщение_ = стандартное::шаг(Другой.сообщение_);    }    вернуть *этот;  }  ~Явный() { стандартное::cout << «Деструктор» << сообщение_ << ''; } частный:  друг класс Неявный;  стандартное::строка сообщение_;};класс Неявный : общественный Явный { общественный:  пустота Изрыгать() {    стандартное::cout << "Неявный (" << сообщение_ << ", " << member_.сообщение_ << ")";  } частный:  Явный member_;};

Подписи

Вот подписи специальных функций-членов:

Функциясинтаксис для класса MyClass
Конструктор по умолчаниюМой класс();
Конструктор копированияMyClass (const MyClass и другие);
Конструктор перемещенияMyClass (MyClass && other) noexcept;
Оператор присваивания копийMyClass & оператор = (const MyClass и другие);
Оператор присваивания перемещенияMyClass & оператор = (MyClass && другой) noexcept;
Деструктор~ MyClass () noexcept;

С ++ 03

В C ++ 03 до появления семантика перемещения специальные функции-члены[4] мы:

использованная литература

  1. ^ ISO / IEC (2011). ИСО / МЭК 14882: 2011 (3-е изд.). ИСО / МЭК. С. §12.
  2. ^ http://accu.org/index.php/journals/1896
  3. ^ За исключением деструктора, если базовый класс уже имеет виртуальный деструктор.
  4. ^ ISO / IEC (1998). Международный стандарт ISO / IEC 14882: Языки программирования - C ++ = Языки программирования - C ++. (1-е изд.). ИСО / МЭК. С. §12. OCLC  71718919.