La segunda semana de aprendizaje: copy constructor copy

concepto

  1. Solo hay un parámetro, que es una referencia al mismo objeto
  2. X::X(X&)O a X::X(const X&)menudo citado con más frecuencia
  3. El sistema generará un constructor de copia predeterminado para completar la función de copia superficial
  4. Si define su propio constructor de copia, el predeterminado será inútil

Tres situaciones que funcionan

  1. Cuando se usa un objeto para inicializar otro objeto,
    classname object1(object2)
    classname object1 = object2esta es una declaración de inicialización, no una asignación
  2. 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 )
  3. El valor de retorno es un objeto de clase A y se llama al constructor de copia al devolverlo.

ESPERANDO

  1. 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

Supongo que te gusta

Origin blog.csdn.net/ZmJ6666/article/details/108551257
Recomendado
Clasificación