Jump to content

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

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

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

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

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

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

#include <iostream>
#include <string>
#include <utility>

class Explicit {
 public:
  Explicit() { std::cout << "Default constructor " << message_ << '\n'; }

  explicit Explicit(std::string message) : message_(std::move(message)) {
    std::cout << "Non-default constructor " << message_ << '\n';
  }

  Explicit(const Explicit& other) {
    std::cout << "Copy constructor " << message_ << '\n';
    *this = other;  // invoke copy assignment operator
  }

  Explicit& operator=(const Explicit& other) {
    std::cout << "Copy assignment operator " << message_ << '\n';
    if (this != &other) {
      message_ = other.message_;
    }
    return *this;
  }

  Explicit(Explicit&& other) noexcept {
    std::cout << "Move constructor " << message_ << '\n';
    *this = std::move(other);  // invoke move assignment operator
  }

  Explicit& operator=(Explicit&& other) noexcept {
    std::cout << "Move assignment operator " << message_ << '\n';
    if (this != &other) {
      message_ = std::move(other.message_);
    }
    return *this;
  }

  ~Explicit() { std::cout << "Destructor " << message_ << '\n'; }

 private:
  friend class Implicit;
  std::string message_;
};

class Implicit : public Explicit {
 public:
  void Spew() {
    std::cout << "Implicit(" << message_ << ", " << member_.message_ << ")\n";
  }

 private:
  Explicit member_;
};

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

Функция синтаксис класса MyClass
Конструктор по умолчанию MyClass();
Копировать конструктор MyClass(const MyClass& other);
Переместить конструктор MyClass(MyClass&& other) noexcept;
Копировать оператор присваивания MyClass& operator=(const MyClass& other);
Переместить оператор присваивания MyClass& operator=(MyClass&& other) noexcept;
Деструктор virtual ~MyClass();

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

  1. ^ ИСО/МЭК (2011). ISO/IEC 14882:2011 (3-е изд.). ИСО/МЭК. стр. §12.
  2. ^ «Соблюдение правила нуля» .
  3. ^ За исключением деструктора, если базовый класс уже имеет виртуальный деструктор.
  4. ^ Аналогично, конструктор перемещения/оператор присваивания получит && параметры вместо альтернатив.
  5. ^ ИСО/МЭК (1998). Международный стандарт ISO/IEC 14882: Языки программирования — C++ = Языки программирования — C++ (1-е изд.). ИСО/МЭК. стр. §12. OCLC   71718919 .
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: e2633f3beb3e0df1d45d59201d18f935__1708549860
URL1:https://arc.ask3.ru/arc/aa/e2/35/e2633f3beb3e0df1d45d59201d18f935.html
Заголовок, (Title) документа по адресу, URL1:
Special member functions - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)