[C++] Clasificación de constructores ③ (Método de llamar a un constructor parametrizado | Método de paréntesis | Método de signo igual)





1. Crear objetos de instancia de clases en diferentes memorias.



En el blog anterior [C ++] Clasificación de constructores ② (Crear objetos de instancia de una clase en diferentes memorias | Crear objetos de instancia en la memoria de pila | Crear objetos con la nueva palabra clave), se analizó la creación de objetos en la memoria de pila y la memoria de montón. Dos situaciones ;

En este blog, continuaremos analizando los dos métodos para llamar a un constructor parametrizado en la memoria de la pila:

  • horquillado
  • método del signo igual

Las variables miembro de la clase C++ son:

public:
	int m_age;
	char* m_name;

Posteriormente, esta variable miembro se utiliza como referencia para asignar valores a estas dos variables miembro;


1. Llamar al constructor usando el método de corchetes


Primero, en la clase Estudiante, defina dos constructores con parámetros y luego use el método de corchetes para llamar a los constructores anteriores;

	// 有参构造函数
	Student(int age, const char* name)
	{
    
    
		// 方法体 省略
		cout << "调用有参构造函数" << endl;
	}

Uso no recomendado: llame manualmente al constructor parametrizado a través del método Student (18, "Tom"). El código anterior generará un objeto de instancia de Student anónimo y luego asignará el objeto anónimo a la variable Student s2 en la memoria de la pila.

Una vez creado el objeto anónimo, se inicializará inmediatamente;

	// 手动调用有参构造函数
	// 直接调用构造函数会产生匿名对象, 涉及到该匿名对象的生命周期
	Student s2 = Student(18, "Tom");

Uso recomendado: para crear un objeto de instancia de una clase en la memoria de la pila, se recomienda utilizar el siguiente método: utilice paréntesis directamente después del nombre de la variable de la memoria de la pila declarada y pase los parámetros del constructor;

	// 使用 括号法 调用有参构造函数
	Student s4(1, "J");

Llamar a Student s4(1, "J") para crear un objeto de instancia es equivalente a llamar al constructor parametrizado Student(int age, const char* name) y luego asignar el objeto de instancia a la variable s4;


2. Llame al constructor usando el método del signo igual.


Primero, defina un constructor de un solo parámetro;

	// 有参构造函数
	Student(const char* name)
	{
    
    
		// 为 m_name 成员分配内存
		m_name = (char*)malloc(100);

		// 为 m_name 成员设置字符串值
		if (m_name != NULL)
		{
    
    
			strcpy_s(m_name, sizeof(name), name);
		}

		// 为 m_age 成员设置初始值
		m_age = 0;

		cout << "调用有参构造函数" << endl;
	}

Utilice el método del signo igual para llamar a un constructor parametrizado con un parámetro,

Asignar la cadena directamente a la variable Student s5 equivale a llamar al constructor parametrizado Student(const char* name) y asignar el objeto de instancia creado a la variable s5.

Esta es una =mejora de C++ para el operador de signo igual;

	// 使用 等号法 调用 有一个参数的 有参构造函数
	// C++ 对等号进行了功能增强
	Student s5 = "K";




2. Ejemplo de código completo



En el siguiente código,

Al declarar la clase Estudiante, definimos:

  • Constructor sin parámetros predeterminado
  • Constructor paramétrico - 1 parámetro
  • Constructor paramétrico - 2 parámetros
  • Copiar constructor: un constructor parametrizado con 1 parámetro, el tipo de función es Student(const Student& obj)

Al llamar al constructor para crear un objeto de instancia, use

  • Declare directamente la variable Student y llame automáticamente al constructor predeterminado sin argumentos.
  • Utilice paréntesis para llamar a un constructor parametrizado de 2 parámetros
  • Llamar al constructor de copia
  • Utilice el método del signo igual para llamar al constructor parametrizado de 1 parámetro

Ejemplo de código:

#include "iostream"
using namespace std;

class Student
{
    
    
public:

	// 无参构造函数
	Student()
	{
    
    
		// 为 m_name 成员分配内存
		m_name = (char*)malloc(100);

		// 为 m_name 成员设置字符串值
		if (m_name != NULL)
		{
    
    
			strcpy_s(m_name, 5, "name");
		}

		// 为 m_age 成员设置初始值
		m_age = 0;

		cout << "调用无参构造函数" << endl;
	}

	// 有参构造函数
	Student(const char* name)
	{
    
    
		// 为 m_name 成员分配内存
		m_name = (char*)malloc(100);

		// 为 m_name 成员设置字符串值
		if (m_name != NULL)
		{
    
    
			strcpy_s(m_name, sizeof(name), name);
		}

		// 为 m_age 成员设置初始值
		m_age = 0;

		cout << "调用有参构造函数" << endl;
	}

	// 有参构造函数
	Student(int age, const char* name)
	{
    
    
		// 为 m_name 成员分配内存
		m_name = (char*)malloc(100);

		// 为 m_name 成员设置字符串值
		if (m_name != NULL)
		{
    
    
			strcpy_s(m_name, sizeof(name), name);
		}

		// 为 m_age 成员设置初始值
		m_age = age;

		cout << "调用有参构造函数" << endl;
	}

	// 拷贝构造函数
	Student(const Student& obj)
	{
    
    
		// 为 m_name 成员分配内存
		m_name = (char*)malloc(100);

		// 为 m_name 成员设置字符串值
		if (m_name != NULL)
		{
    
    
			strcpy_s(m_name, sizeof(obj.m_name), obj.m_name);
		}

		// 为 m_age 成员设置初始值
		m_age = obj.m_age;

		cout << "调用拷贝构造函数" << endl;
	}

	~Student()
	{
    
    
		// 销毁 name 指向的堆内存空间
		if (m_name != NULL)
		{
    
    
			free(m_name);
		}
		cout << "调用析构函数" << endl;
	}

public:
	int m_age;
	char* m_name;
};

int main()
{
    
    
	// 声明 Student 类型实例对象
	// 调用无参构造函数
	Student s1;
	// 打印 Student s1 实例对象值
	cout << "name : " << s1.m_name << " , age : " << s1.m_age << endl;

	// 手动调用有参构造函数
	// 直接调用构造函数会产生匿名对象, 涉及到该匿名对象的生命周期
	Student s2 = Student(18, "Tom");
	// 打印 Student s1 实例对象值
	cout << "name : " << s2.m_name << " , age : " << s2.m_age << endl;

	// 使用 括号法 调用有参构造函数
	Student s4(1, "J");
	// 打印 Student s4 实例对象值
	cout << "name : " << s4.m_name << " , age : " << s4.m_age << endl;

	// 使用 等号法 调用 有一个参数的 有参构造函数
	// C++ 对等号进行了功能增强
	Student s5 = "K";
	// 打印 Student s4 实例对象值
	cout << "name : " << s5.m_name << " , age : " << s5.m_age << endl;

	// 调用拷贝构造函数
	Student s3 = Student(s2);
	// 打印 Student s3 实例对象值
	cout << "name : " << s3.m_name << " , age : " << s3.m_age << endl;



	// 控制台暂停 , 按任意键继续向后执行
	system("pause");
	return 0;
}

Resultados de:

调用无参构造函数
name : name , age : 0
调用有参构造函数
name : Tom , age : 18
调用有参构造函数
name : J , age : 1
调用有参构造函数
name : K , age : 0
调用拷贝构造函数
name : Tom , age : 18
请按任意键继续. . .

Insertar descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/han1202012/article/details/132815469
Recomendado
Clasificación