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