Directorio de artículos
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 个 ==========
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: