= по умолчанию для элементов управления копированием - PullRequest
0 голосов
/ 07 декабря 2018

«Начинающий в C ++»

Почему так много классов используют = по умолчанию для конструктора копирования и оператора присваивания и для их не виртуальных деструкторов?

Как это сделать

class A{
public:
    A() = default;
    A(int);
};

отличается от

class A{
public:
    A() = default;
    A(int);
    A(const A&) = default;
    A& operator=(const A&) = default;
    ~A() = default;
};

Насколько я понимаю, даже без этих = по умолчанию эти операции будут синтезированы.

1 Ответ

0 голосов
/ 07 декабря 2018

Даже когда методы могут быть сгенерированы автоматически, их явное объявление позволяет

  • контролировать видимость (private, protected, public)
  • добавлять комментарии к документации
  • демонстрация того, что автор не забыл пометить их =delete
  • , гарантируя, что добавление элемента, не подлежащего копированию, приведет к явной и понятной ошибке как можно раньше
  • отключение операций перемещения (хотя это лучше сделать с =delete вместо соответствующих элементов)

Иногда элементы должны быть объявлены в заголовке, а реализовано с помощью =defaultв реализации, если у класса есть член неполного типа, который должен быть скопирован или удален.Это довольно распространено для деструкторов при реализации шаблона PIMPL с использованием const std::unique_ptr<impl>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...