Conceptos Avanzados de Clases y Objetos en C++

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

  1. El orden de inicialización depende de la declaración en la clase
  2. Constructores de parámetro único permiten conversión implícita
  3. 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
}

Etiquetas: C++14 Constructores static friend inner_class

Publicado el 9-23 14:22