У меня есть несколько вопросов о конструкторах в C ++. Для каждого вопроса (от (1) до (4)) я хотел бы знать, правильно ли определено поведение по отношению к стандарту.
А) Первый касается инициализации членов:
class Class
{
public:
Class()
: _x(0)
, _y(_x)
, _z(_y) // <- (1) Can I initialize a member with other members ?
{
;
}
protected:
int _x;
int _y;
int _z;
};
Б) Какие функции добавлены в каждый класс компилятором?
template<typename T> class Class
{
public:
template<typename T0>
Class(const Class<T0>& other)
{
std::cout<<"My copy constructor"<<std::endl;
_x = other._x;
}
template<typename T0 = T>
Class (const T0 var = 0)
{
std::cout<<"My normal constructor"<<std::endl;
_x = var;
}
public:
T _x;
};
// (2) Are
// Class(const Class<T>& other)
// AND
// inline Class<T>& operator=(const Class<T>& other)
// the only functions automatically added by the compiler ?
В качестве примера, если я позвоню:
Class<int> a;
Class<int> b(a); // <- Will not write "My copy constructor"Class<double> c(a); // <- Will write "My copy constructor"
(3) Является ли это поведение совершенно нормальным в соответствии со стандартом?
(4) Есть ли у меня гарантия, что пустой конструктор не будет добавлен автоматически и что Class<int> x;
напишет "My normal constructor"
?
Могу ли я инициализировать участника с другими участниками?
Да, если эти другие члены уже инициализированы; то есть до тех пор, пока их декларации предшествуют инициализации члена.
Являются ли [конструктор копирования] и [оператор копирования-назначения] единственными функциями, автоматически добавляемыми компилятором?
Это также неявно объявит деструктор, который уничтожит _x
используя его деструктор.
В C ++ 11 конструктор перемещения (Class(Class&&)
) и оператор присваивания (Class& operator=(Class&&)
) также объявляются неявно, если только вы не объявляете конструктор копирования или перемещения или оператор присваивания копирования или перемещения.
Обратите внимание, что ваш шаблон конструктора не конструктор копии, и вместо него будет использован неявный:
Class<T1> t1;
Class<T1>(t1); // prints nothing
Class<T2>(t1); // prints "My copy constructor" (which is a lie)
Это поведение совершенно нормально в соответствии со стандартом?
Да, см. Главу 12.
Есть ли у меня гарантия, что пустой конструктор не будет добавлен автоматически и что
Class<int> x;
напишет"My normal constructor"
?
Да, конструктор по умолчанию будет объявлен неявно только в том случае, если вы вообще не объявите никаких конструкторов.
Других решений пока нет …