Clases y Objetos [3] Listas de Inicialización

introducción

El constructor se introdujo en el artículo anterior, al que se puede llamar automáticamente cuando se crea una instancia de un objeto de clase para inicializar el objeto de clase: póngame un empujón
para ver la explicación detallada de la función miembro predeterminada
Sin embargo, no es difícil encontrar que las variables miembro en el cuerpo del constructor, la inicialización es en realidad una asignación para ellos en lugar de una definición. Luego, para algunas variables a las que solo se les puede dar un valor en el momento de la definición, no se pueden cambiar después de la definición (como las variables constantes y las variables de referencia) o algunas variables miembro de tipo de clase sin un constructor predeterminado, no se pueden definir en el constructor . Obviamente, usar el constructor no puede satisfacer nuestras necesidades.

Entonces, ¿dónde se definen estas variables miembro cuando se crea una instancia del objeto de clase? ¿Cómo se inicializan cuando se definen?
Las variables miembro se definen e inicializan en una lista de inicializadores :

lista de inicialización

Las variables miembro generales se pueden asignar varias veces y, por supuesto, es posible asignar valores en el cuerpo del constructor. Sin embargo, en el cuerpo del constructor, solo se puede realizar la asignación y no se pueden definir las variables miembro, por lo que no se pueden definir las variables miembro constantes, las variables miembro de referencia y los miembros de clase sin constructores predeterminados . Y estas variables miembro deben definirse e inicializarse explícitamente en la lista de inicialización:

class A
{
    
    
public:
	A(int a)
	{
    
    
		_a = a;
	}
private:
	int _a;
};

class B
{
    
    
public:
	/* B(int b)
	{
		_b = b; 
		_c = b;  
	} */
	//错误代码: 表达式不能是常量,A不能没有默认构造函数
private:
	int& _b;       //引用成员变量
	const int _c;  //const成员变量
	A _obj;        //没有默认构造函数的成员类
};

inserte la descripción de la imagen aquí

definición

La lista de inicializadores viene después de la lista de parámetros del constructor y comienza con dos puntos, seguida de una lista de miembros de datos separados por comas, cada "variable de miembro" seguida de un valor o expresión inicial entre paréntesis:

类名(参数列表)
   : 成员变量(初始值)
   , 成员变量(初始值)
   , ...
{
    
    }

La lista de inicialización es donde se definen las variables miembro, y podemos definir e inicializar las tres variables miembro anteriores en la lista de inicialización:

class A
{
    
    
public:
	A(int a)
	{
    
    
		_a = a;
	}
private:
	int _a;
};

class B
{
    
    
public:
	B(int b)
		: _b(b)
		, _c(b)
		, _obj(b) //在初始化列表调用其构造函数
	{
    
    }
private:
	int& _b;
	const int _c;
	A _obj;
};

característica

  1. Cada variable miembro solo puede aparecer una vez en la lista de inicialización (la inicialización solo puede inicializarse una vez);
  2. Las variables miembro de referencia, las variables miembro constantes y las clases miembro sin funciones miembro predeterminadas deben colocarse en la lista de inicialización para la inicialización ;
  3. Para las variables miembro de tipo personalizado, la lista de inicialización se usará para definir e inicializar primero (el valor predeterminado proporcionado en la declaración de la variable miembro se usa en la lista de inicialización);
  4. El orden en que se declaran las variables miembro en la clase es el orden en que se inicializan en la lista de inicialización, independientemente de su orden en la lista de inicialización (por lo que se recomienda que el orden de declaración sea consistente con el orden en la lista de inicialización lista):
class A
{
    
    
public:
	A(int a)
		: _a1(a)
		, _a2(a1) //错误代码:未定义标识符a1
	{
    
    }

private:
	int _a2;
	int _a1;
};

Resumir

En este punto, la introducción de la lista de inicialización ha terminado.
En la programación futura, se recomienda que las variables miembro se inicialicen en la lista de inicialización. Por supuesto, también hay algunas situaciones que deben asignarse en el constructor, por ejemplo, cuando es necesario abrir espacio dinámicamente, la lista de inicialización obviamente no es adecuada.

Si cree que no presenté una parte determinada claramente o que hay un problema con una parte determinada, puede plantearlo en el área de comentarios.

Si este artículo es útil para usted, espero que se conecte con un solo clic.

Espero progresar junto con usted.

Supongo que te gusta

Origin blog.csdn.net/weixin_73450183/article/details/130756392
Recomendado
Clasificación