Constructer Revisado
Cuando se crea un objeto, el compilador invoca el constructor para asignar valores iniciales a cada miembro. Sin embargo, esto se considera asignación de valores iniciales, no inicialización propiamente dicha. La verdadera inicialización ocurre en la lista de inicialización.
class Fecha {
public:
Fecha(int anio, int mes, int dia)
: _anio(anio),
_mes(mes),
_dia(dia)
{}
private:
int _anio;
int _mes;
int _dia;
};
Casos que requieren inicialización en lista:
- Referencias
- Miembros const
- Tipos personalizados sin constructor predeterminado
Consideraciones Clave
- El orden de inicialización depende de la declaración en la clase
- Constructores de parámetro único permiten conversión implícita
- El modificador explicit deshabilita esta conversión
Miembros Estáticos
Variables y funciones declaradas con static:
- Compartidas por todos los objetos de la clase
- Las variables deben inicializarse fuera de la clase
- Accesibles mediente instancia::miembro
- Las funciones no tienen acceso a miemrbos no estáticos
class Contable {
public:
Contable() { ++_contador; }
~Contable() { --_contador; }
static int obtenerTotal() { return _contador; }
private:
static int _contador;
};
int Contable::_contador = 0;
Funciones y Clases Friend
Amistad Funcional
- Acceso a miembros privados/protegidos
- No obligado a modificador const
- Declarados con friend en cualquier zona
Amistad Clase
- Casos de acceso bidireccional
- Relaciones no transitivas
- Siempre unidireccional
class Temporizador {
friend class CuentaRegresiva;
private:
int _horas;
int _minutos;
int _segundos;
};
class CuentaRegresiva {
public:
void establecerTiempo(Temporizador& t) {
t._horas = 0;
}
};
Clases Internas
- Definidas dentro de otra clase
- Acceso directo a miembros externos
- Modificadores acceso sin efecto
class Externo {
class Interno {
public:
void accederExterno(Externo& e) {
e.valorExterno = 10;
}
};
private:
int valorExterno;
};
Objetos Anónimos
Objetos temporales con ciclo de vida limitado:
class Temporizador {
public:
Temporizador() {
std::cout << "Constructor";
}
~Temporizador() {
std::cout << "Destructor";
}
};
int main() {
Temporizador();
// Destructor se invoca inmediatamente
}