Разное

До отдельной темы не дотягивает, но тоже важно. Возможно, если появится больший объем информации по связанной теме, факты перекочуют туда.


• Договорённости по сигнатурам для конструктора-копировщика и оператора присваивания:
T(const T& _rhs);
T& operator=(const T& _rhs);
В операторе присваивания для безопасности (чтобы не стереть свои данные, а потом постараться присвоить их себе же) и для оптимального решения (не смысла присваивать себе же, пусть даже через временный объект), следует выполнять проверку
if (&_rhs == this)
и если это выражение вернёт true, вернуть *this. В конструкторе-копировщике делать подобную проверку не верно. Мы ведь только создаём объект. И присваивать себя же пока не можем.
Присваивание происходит, когда к уже созданному и инициализированному объекту применяется оператор =. Копирование же происходит при инициализации, присваивании при инициализации, возврате из функции по значению, передаче в функцию по значению и перехвате исключений.
Рассмотрим пример класса Pen, который содержит конструктор, принимающий цвет, конструктор-копировщик и оператор присваивания.
Pen teachersPen(RED);   // Копирование.
Pen usualPen = BLUE;    // Тоже копирование. Всё равно вызывается конструктор-копировщик.
usualPen = teachersPen; // Присваивание. operator=.



• Метод класса, позволяющий более оптимально (чем стандартная реализация std::swap) обменять значениями используемый объект и объект, полученный в параметре, принято называть swap. Его сигнатура:
template<typename T>

void MyVector<T>::swap(MyVector& _rThat);

При наличии такого метода в классе очень просто написать специализацию для 
std::swap:
template<typename T>
void swap(MyVector<T>& _l, MyVector<T>& _r{
  _l.swap(_r);
}


Метод класса, применяемый в шаблоне проектирования «Прототип» принято называть clone. Его сигнатура и выполнение:
T* clone() const { return new T(*this); }



• При наследовании в производном классе недоступны private-методы базового. Но если они виртуальны, их можно переопределить в производном! В данном случае вызывать такой метод можно будет только из другого метода базового класса, что очень удобно при реализации шаблона проектирования «Шаблонный метод».