Одна из рекомендаций в Google Code Style звучит следующим образом:
Provide a copy constructor and assignment operator only when necessary. Otherwise, disable them with DISALLOW_COPY_AND_ASSIGN.
Обоснование приводится следующее:
Implicit copying of objects in C++ is a rich source of bugs and of performance problems.
It also reduces readability, as it becomes hard to track which objects are being passed
around by value as opposed to by reference, and therefore where changes to an object are reflected.
Как вы считаете, действительно ли это стоящая рекомендация и следует её придерживаться, или это просто преверженность привычному C-стилю и страх перед новым, мол какая-то это новая неведамая фигня, давайте не будём её использовать?
И небольшой частный случай, привёдший к такому вопросу. Есть класс ConstMatrix (матрица, элементы которой нельзя изменять) и Matrix (просто матрица). Matrix наследует от ConstMatrix. Оба типа матриц нужно транспонировать. Результат транспонирования всегда будет ConstMatrix. Важно заметить, что сложность копирования матрицы при такой архитектуре стремится к O(1). Соответственно вижу два подхода к решению этой задачи:
- Запрещаем конструктор копирования и присваивания
C++ (Qt)
void ConstMatrix::transpose(ConstMatrix &transposed) const
{
// Проверяем в runtime действительно ли transposed - объект класса ConstMatrix, а не объект дочернего класса.
// Если это объект дочернего класса - получаем потенциальную проблему безопасности.
transposed=...
}
void someFunction(const Matrix &A)
{
ConstMatrix transposed;
A.transpose(transposed);
....
}
- Разрешаем конструктор копирования и присваивания
C++ (Qt)
ConstMatrix ConstMatrix::transposed() const
{
Const Matrix transposed;
...
return transposed;
}
void someFunction(const Matrix &A)
{
ConstMatrix transposed = A.transposed();
....
}
Мне больше нравится второй вариант потому что
1. Отсев ошибок на этапе компиляции предпочтительней отсева ошибок на этапе выполнения.
2. Минимизируется время между объявлением и инициализацией переменной transposed
3. Такой код легче читается, более понятен
НО! Может быть есть какие-то подводные камни из-за разрешения присваивания/копирования (лично я-то ничего плохого/опасного в этом не вижу)?