Reglas de uso del constructor de aprendizaje de C++

sobre las reglas

// De forma predeterminada, el compilador de C++ agrega al menos tres funciones a una clase

// 1. Constructor predeterminado (sin parámetros, el cuerpo de la función está vacío)

// 2. Destructor predeterminado (sin parámetros, el cuerpo de la función está vacío)

// 3. La función de copia predeterminada, copia el valor de sus propiedades.

//Reglas de llamada del constructor:
//Si el usuario define un constructor con parámetros, C++ ya no proporciona un constructor predeterminado sin argumentos, pero proporcionará una función de copia predeterminada
//Si el usuario define un constructor de copia, C++ no proporcionará otros constructores

texto

Supongamos que tenemos una clase Persona simple que representa la información de una persona, incluido el nombre y la edad. Primero, no definamos ningún constructor, copiemos constructores o destructores y veamos qué funciones generará automáticamente el compilador para nosotros.

#include <iostream>
#include <string>

class Person {
public:
    std::string name;
    int age;
};

int main() {
    Person person1; // 默认构造函数被调用
    person1.name = "Alice";
    person1.age = 30;

    Person person2 = person1; // 默认拷贝构造函数被调用

    return 0;
}

En este ejemplo, definimos una clase Persona con dos propiedades: nombre y edad. En la función principal, primero creamos un objeto Persona llamado persona1. Como no definimos ningún constructor, el compilador generó un constructor predeterminado para nosotros. Este constructor predeterminado no tiene parámetros y el cuerpo de la función está vacío, por lo que podemos usar Persona persona1; para crear un objeto persona1 vacío.

A continuación, copiamos el valor de persona1 en persona2, momento en el que se llama al constructor de copia predeterminado. El constructor de copia predeterminado copiará los valores de las variables miembro uno por uno, por lo que persona2 tendrá los mismos valores de propiedad que persona1.

Ahora, definamos un constructor parametrizado y un constructor de copia, y veamos cómo afectan la generación de funciones predeterminadas y las reglas de llamada del constructor:

#include <iostream>
#include <string>

class Person {
public:
    std::string name;
    int age;

    // 有参构造函数
    Person(const std::string& n, int a) : name(n), age(a) {
        std::cout << "Parametric constructor called" << std::endl;
    }

    // 拷贝构造函数
    Person(const Person& other) : name(other.name), age(other.age) {
        std::cout << "Copy constructor called" << std::endl;
    }
};

int main() {
    Person person1("Alice", 30); // 有参构造函数被调用

    Person person2 = person1; // 拷贝构造函数被调用

    return 0;
}

En este ejemplo, definimos un constructor parametrizado y un constructor de copia. Ahora, dado que definimos un constructor parametrizado, el compilador ya no genera un constructor predeterminado sin argumentos para nosotros. Sin embargo, el compilador seguirá generando un constructor de copia predeterminado para nosotros, porque cuando no definimos un constructor de copia, el compilador proporcionará una implementación predeterminada.

En la función principal, primero creamos un objeto persona1 usando el constructor parametrizado y luego copiamos su valor a persona2. Dado que definimos un constructor parametrizado, el compilador ya no proporciona un constructor predeterminado sin argumentos, pero aún proporciona un constructor de copia predeterminado. Por lo tanto, se llama al constructor de copias para copiar el valor de persona1 en persona2.

en conclusión:

Constructor predeterminado: si no se define ningún constructor, el compilador le proporcionará un constructor predeterminado sin argumentos.
Constructor de copia predeterminado: si no se define ningún constructor de copia, el compilador le proporcionará un constructor de copia predeterminado para copiar objetos por valor.
Reglas de llamada del constructor: si define un constructor parametrizado, el compilador ya no proporciona un constructor predeterminado sin argumentos, pero aún proporciona un constructor de copia predeterminado. Si define un constructor de copia, el compilador ya no proporciona otros constructores.
Estas reglas ayudan a comprender el constructor y las reglas de generación de funciones predeterminadas en C++.

Guess you like

Origin blog.csdn.net/wniuniu_/article/details/132645536