Нужно ли явно определять конструктор по умолчанию, когда мы определяем конструктор копирования для класса? Просьба привести причины.Копировать конструктор и конструктор по умолчанию
например:
class A
{
int i;
public:
A(A& a)
{
i = a.i; //Ok this is corrected....
}
A() { } //Is this required if we write the above copy constructor??
};
Кроме того, если мы определим любой другой параметризованный конструктор для класса, отличного от конструктора копии, мы также должны определить конструктор по умолчанию ?? Рассмотрим приведенный выше код без конструктора копирования и заменить его
A(int z)
{
z.i = 10;
}
Alrite .... После просмотра ответов я написал следующую программу.
#include <iostream>
using namespace std;
class X
{
int i;
public:
//X();
X(int ii);
void print();
};
//X::X() { }
X::X(int ii)
{
i = ii;
}
void X::print()
{
cout<<"i = "<<i<<endl;
}
int main(void)
{
X x(10);
//X x1;
x.print();
//x1.print();
}
И эта программа работает нормально без конструктора по умолчанию. Пожалуйста, объясните, почему это так? Я действительно смущен концепцией .....
Я смущен. Хотя приведенный ниже ответ верен, это не конструктор копирования. Где вы копируете 'i', точно? Вы изменяете правую часть, что обычно неправильно. Вы должны делать 'A (const A & rhs): i (rhs.i) {}', то есть скопировать правую часть 'i' в этот экземпляр A' i'. Обратите внимание, что параметры передаются константой, потому что, когда вы говорите что-то вроде x = 3, 3 не следует изменять. Кроме того, обычно числовые типы передаются по значению, а не по ссылке, потому что ссылки могут быть медленнее для небольших типов данных. – GManNickG
Wow .... Спасибо за ваш комментарий ... он очистил путаницу в отношении «: i (rhs.i)» части конструктора, который меня смутил, так как я начал изучать конструкторы этим утром .... –
последняя программа не использует конструктор по умолчанию в любом месте. По этой причине вам не нужно ее определять. Вот и все. – AnT