c++ - sintomas - cáncer de colon: tratamientos
C++, ¿qué significa el colon después de un constructor? (6)
Posibles duplicados:
Variables después del colon en un constructor
Pregunta de sintaxis del constructor C ++ (noob)
Tengo un código C ++ aquí:
class demo
{
private:
unsigned char len, *dat;
public:
demo(unsigned char le = 5, unsigned char default) : len(le)
{
dat = new char[len];
for (int i = 0; i <= le; i++)
dat[i] = default;
}
void ~demo(void)
{
delete [] *dat;
}
};
class newdemo : public demo
{
private:
int *dat1;
public:
newdemo(void) : demo(0, 0)
{
*dat1 = 0;
return 0;
}
};
Mi pregunta es, ¿a qué se llaman : len(le)
y : demo(0, 0)
?
¿Tiene algo que ver con la herencia?
Como han dicho otros, es una lista de inicialización. Puedes usarlo por dos cosas:
- Llamar a los constructores de la clase base
- Inicializando las variables miembro antes de que se ejecute el cuerpo del constructor.
Para el caso n. ° 1, supongo que comprende la herencia (si ese no es el caso, hágamelo saber en los comentarios). Entonces simplemente llama al constructor de su clase base.
Para el caso n. ° 2, se puede formular la pregunta: "¿Por qué no inicializarlo en el cuerpo del constructor?" La importancia de las listas de inicialización es particularmente evidente para los miembros de la const
. Por ejemplo, eche un vistazo a esta situación, donde quiero inicializar m_val
basado en el parámetro constructor:
class Demo
{
Demo(int& val)
{
m_val = val;
}
private:
const int& m_val;
};
Según la especificación C ++, esto es ilegal. No podemos cambiar el valor de una variable const
en el constructor, porque está marcado como const. Entonces puedes usar la lista de inicialización:
class Demo
{
Demo(int& val) : m_val(val)
{
}
private:
const int& m_val;
};
Ese es el único momento en que puede cambiar una variable miembro de const. Y como observó Michael en la sección de comentarios, también es la única forma de inicializar una referencia que es un miembro de la clase.
Aparte de usarlo para inicializar las variables miembro de const
, parece que se ha aceptado generalmente como "la forma" de inicializar las variables, por lo que es claro para otros programadores que leen su código.
Estás llamando al constructor de su clase base, demo.
Esto se llama una lista de inicialización. Es para pasar argumentos al constructor de una clase padre. Aquí hay un buen enlace que lo explica: Listas de inicialización en C ++
Se llama una lista de inicialización. Inicializa los miembros antes de que se ejecute el cuerpo del constructor.
Se llama una lista de inicialización. Una lista de inicializadores es cómo pasa argumentos a los constructores de sus variables miembro y para pasar argumentos al constructor de la clase padre.
Si usa =
para asignar en el cuerpo del constructor, primero se llama al constructor predeterminado, luego se llama al operador de asignación. Esto es un poco derrochador, y a veces no hay un operador de asignación equivalente.
Significa que len
no se establece utilizando el constructor predeterminado. mientras se construye la clase de demo
. Por ejemplo:
class Demo{
int foo;
public:
Demo(){ foo = 1;}
};
Primero pondría un valor en foo antes de establecerlo en 1. Es un poco más rápido y más eficiente.