concepto
- Solo hay un parámetro, que es una referencia al mismo objeto
X::X(X&)
O aX::X(const X&)
menudo citado con más frecuencia- El sistema generará un constructor de copia predeterminado para completar la función de copia superficial
- Si define su propio constructor de copia, el predeterminado será inútil
Tres situaciones que funcionan
- Cuando se usa un objeto para inicializar otro objeto,
classname object1(object2)
classname object1 = object2
esta es una declaración de inicialización, no una asignación- El parámetro es un objeto de la clase A. Al invocar, se llamará al constructor de copia de la clase A
void func(A a1)
y se deben inicializar todos los objetos de la clase. Esta inicialización llamará a la función del constructor de copia (la sobrecarga será relativamente grande, por lo que generalmente considere parámetros de referencia constantes )- El valor de retorno es un objeto de clase A y se llama al constructor de copia al devolverlo.
ESPERANDO
- La asignación entre objetos no da como resultado una llamada al constructor de copia (si no está inicializada o asignada)
Ejemplo
#include<iostream>
#include<string>
#include<cstring>
using namespace std;
class student
{
private:
string name;
char* hobby;
int age;
public:
student(string n="no",char h[]=nullptr,int a=0);
student(const student& s);
~student();
void displace();
} ;
student::student(string n,char h[],int a):name(n),age(a)
{
hobby = new char[strlen(h)+1];
strcpy(hobby,h);
}
student::student(const student& s):name(s.name),age(s.age)
{
hobby = new char[strlen(s.hobby)+1];
strcpy(hobby,s.hobby);
}
student::~student()
{
delete [] hobby;
}
void student::displace()
{
cout<<name<<" is "<<age<<" years old and good at "
<<hobby<<endl;
}
int main()
{
student s2("Jeff","studying",20),s3("Alice","talking",18)
,s1=s2;
s2.displace();
s3.displace();
cout<<"S1 as followed: "<<endl;
s1.displace();
}
ps. Si hay una asignación dinámica de memoria, debe ser el destructor delete