Ваш код вообще не является C ++ 11.Я думал о том, могут ли здесь работать конструкторы перемещения, поскольку вы по сути перемещаете один А в другой, а затем слегка его модифицируете.
Как и в случае с C ++ 03, вы можете оптимизировать инициализацию, которую хотите выполнить один раз, во всех ваших конструкторах.либо помещая их в подкласс, либо в базовый класс (часто с защищенным или частным наследованием, поскольку это деталь реализации).Используя базовый класс:
class ABase
{
protected:
int num;
ABase() : num(42) {}
};
class A : protected ABase
{
public:
A() = default; // or in C++03 just {}
explicit A(int input) : ABase()
{
num *= input;
}
};
(Вы можете изменить свои права доступа по вкусу).Проблема здесь в том, что я создаю только один объект «ABase», и если он имеет больше, чем просто тривиальный член int, это может быть важно.Мне очень нравится наследование, поскольку я затем использую его в A в качестве члена класса, а не члена какого-либо агрегированного объекта, и я предпочитаю наследование, защищенное или частное, здесь, но иногда, если в базовом классе есть члены, которые я хочу быть общедоступными, я будуиспользовать публичное наследование, но дать базовому классу защищенный деструктор.Это при условии, что нет v-таблицы, и, следовательно, дальнейшее получение не ожидается.(На самом деле вы можете завершить A здесь, сделав наследование виртуальным и частным, но вы, вероятно, не хотите).