[C++] Lista de inicialización del constructor ① (Problemas del constructor cuando se usan objetos de clase como variables miembro | Reglas de sintaxis de la lista de inicialización del constructor)





1. Problemas del constructor cuando se utilizan objetos de clase como variables miembro




1. Descripción del problema


Si un objeto de clase A se utiliza como variable miembro de otra clase B,

Se informará un error en los siguientes escenarios:

  • Defina un constructor parametrizado para la clase A, entonces el constructor predeterminado sin parámetros de A no será válido;
  • En este momento, si utiliza el constructor sin parámetros predeterminado para inicializar B, se informará un error;

En una clase, sus variables miembro son de un tipo con un constructor parametrizado, en este caso no hay posibilidad de llamar al constructor parametrizado y se producirá un error de compilación.


En el siguiente código, A solo se puede inicializar mediante el constructor parametrizado A(int age, int height)y el constructor sin parámetros ya no se puede utilizar;

class A
{
    
    
public:
	// 带参构造函数
	A(int age, int height)
	{
    
    
	}

public:
	int m_age;		// 年龄
	int m_height;	// 身高
};

En B, declare la variable miembro de A de la siguiente manera. Solo puede llamar al constructor sin parámetros de A para crear el objeto A. Sin embargo, el constructor sin parámetros de A no se puede usar. Debe usar el constructor parametrizado de A. Ocurre un problema aquí y se informa un error “B::B(void)”: 由于 数据成员“B::m_a”不具备相应的 默认构造函数 或重载解决不明确,因此已隐式删除函数;

class B
{
    
    
public:
	int m_age;		// 年龄
	A m_a;			// A 类型成员变量
};

La solución al problema anterior es la lista de inicialización del constructor en C++;


2. Ejemplo de código de error


Ejemplo de código:

#include "iostream"
using namespace std;

class A
{
    
    
public:
	// 带参构造函数
	A(int age, int height)
	{
    
    
	}

public:
	int m_age;		// 年龄
	int m_height;	// 身高
};

class B
{
    
    
public:
	int m_age;		// 年龄
	A m_a;			// A 类型成员变量
};


int main()
{
    
    
	// 通过 B 的默认无参构造函数初始化 B 对象
	B b;


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

Resultados de:

已启动生成…
1>------ 已启动生成: 项目: HelloWorld, 配置: Debug Win32 ------
1>hello_world.cpp
1>D:\002_Project\006_Visual_Studio\HelloWorld\HelloWorld\hello_world.cpp(28): error C2280:B::B(void): 尝试引用已删除的函数
1>D:\002_Project\006_Visual_Studio\HelloWorld\HelloWorld\hello_world.cpp(22): message : 编译器已在此处生成“B::B”
1>D:\002_Project\006_Visual_Studio\HelloWorld\HelloWorld\hello_world.cpp(22,1): message :B::B(void): 由于 数据成员“B::m_a”不具备相应的 默认构造函数 或重载解决不明确,因此已隐式删除函数
1>D:\002_Project\006_Visual_Studio\HelloWorld\HelloWorld\hello_world.cpp(21): message : 参见“B::m_a”的声明
1>已完成生成项目“HelloWorld.vcxproj”的操作 - 失败。
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0==========

Insertar descripción de la imagen aquí





2. Lista de inicialización del constructor




1. Reglas de sintaxis de la lista de inicialización del constructor


En el lenguaje C++, la lista de inicialización del constructor es un método utilizado para inicializar las variables miembro de una clase;


La lista de inicialización del constructor puede implementar funciones:

  • Proporcionar valores iniciales para las variables miembro.
  • Llame al constructor de otras variables miembro para inicializar las variables miembro

Reglas de sintaxis de la lista de inicialización del constructor:

构造函数() : 成员变量名称(成员变量值) , 成员变量名称(成员变量值) 
{
    
    
	// 构造函数内容
}
  • La lista de inicialización del constructor se encuentra después de la lista de parámetros del constructor, entre los dos puntos :y las llaves {};
  • Utilice comas ,para separar;
  • Los elementos de la lista de inicialización constan del nombre y el valor inicial de la variable miembro, =conectados mediante el signo igual;

En el siguiente código, se define un constructor predeterminado para la clase B, que define una lista de inicialización del constructor;

En la lista de inicialización,

  • m_age(10)Proporciona el valor inicial para m_age;
  • m_a(10, 150)Se llama al constructor parametrizado de A;

Ejemplo de código:

class B
{
    
    
public:
	B() : m_age(10) , m_a(10, 150)
	{
    
    }
public:
	int m_age;		// 年龄
	A m_a;			// A 类型成员变量
};

2. Ejemplo de código: reglas de sintaxis de la lista de inicialización del constructor


Ejemplo de código:

#include "iostream"
using namespace std;

class A
{
    
    
public:
	// 带参构造函数
	A(int age, int height)
	{
    
    
		m_age = age;
		m_height = height;
	}

public:
	int m_age;		// 年龄
	int m_height;	// 身高
};

class B
{
    
    
public:
	B() : m_age(10) , m_a(10, 150)
	{
    
    }
public:
	int m_age;		// 年龄
	A m_a;			// A 类型成员变量
};


int main()
{
    
    
	// 通过 B 的默认无参构造函数初始化 B 对象
	B b;


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

Resultados de:

Insertar descripción de la imagen aquí

Supongo que te gusta

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