Lista de inicialización del constructor C ++

¿Cómo inicializar la lista en C ++?

Inserte la descripción de la imagen aquí
Mira un código simple:

class Test
{
    
    
public:
	Test(int a)
	{
    
    
		ma = a;
	}
private:
	const int ma;
};

Resultado de la operación: Puedo
Inserte la descripción de la imagen aquí
ver que el programa está funcionando mal, ¿cuál es el motivo?
Inserte la descripción de la imagen aquí
La razón es que las variables modificadas const deben inicializarse.
Entonces, ¿cómo se inicializan las variables modificadas const en C ++?

Mira el siguiente fragmento de código:

class Test
{
    
    
public:
	Test(int a):ma(a)
	{
    
    
		//ma = a;
	}
private:
	const int ma;
};

Inserte la descripción de la imagen aquí

Por supuesto, en realidad, hay más de una variable en muchos casos. Entonces, ¿con qué tiene que ver el orden de ejecución en la lista de inicialización del constructor?

Mira un fragmento de código:

class Test
{
    
    
public:
	Test(int a)
		:ma(mb), mb(a)
	{
    
    
	}
	void Show()
	{
    
    
		std::cout << "ma: " << ma << std::endl;
		std::cout << "mb: " << mb << std::endl;
	}
private:
	int ma;
	int mb;
};
int main()
{
    
    
	Test test(10);
	test.Show();
	return 0;
}

¿Cuáles son los valores de ma y mb? ma = mb = 10?
Inserte la descripción de la imagen aquí
Mire el resultado:
Inserte la descripción de la imagen aquí
puede ver que ma es un valor inválido (cccccccc se usa para la inicialización al abrir la memoria, y cccccccc es un valor inválido) mb = 10; se puede ver que mb en sí mismo aún no ha sido asignado a ma Asignado por a;
mira el código a continuación:

class Test
{
    
    
public:
	Test(int a)
		:ma(mb), mb(a)
	{
    
    
	}
	void Show()
	{
    
    
		std::cout << "ma: " << ma << std::endl;
		std::cout << "mb: " << mb << std::endl;
	}
private:
	int mb;
	int ma;
	
};
int main()
{
    
    
	Test test(10);
	test.Show();
	return 0;
}

¿Cuáles son los valores de ma y mb en este momento, y son los mismos que antes?
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Solo mb = 10, hay ma = 10; ¿
Inserte la descripción de la imagen aquí
es un poco incómodo?

A continuación, observamos la diferencia entre las dos piezas de código:
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
puede ver que la única diferencia entre los códigos en ambos extremos es el orden de declaración de la variable.
Por lo tanto, el orden de ejecución en la lista de inicialización del constructor ** C ++ está relacionado con el orden de declaración de los miembros, no con el orden de implementación. **
Mire de nuevo el resultado de cambiar el orden de realización.
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/Gunanhuai/article/details/102965254
Recomendado
Clasificación