Constructor explicito con argumentos por omision

Como ya hemos visto, una clase, permite encapsular la información a través de atributos y métodos que utilizan la información, ocultando la información y la implementación del comportamiento de las clases.

La definición de una clase define nuevos TDAs.

La definición en C++ consiste en el uso de la clave reservada class, seguida del nombre de la clase y finalmente el cuerpo de la clase encerrado entre llaves y finalizando con ;.

El cuerpo  o bloque de la clase contiene la declaración de los atributos de la clase (variables) y la declaración de los métodos (funciones).

Tanto los atributos como los métodos pertenecen exclusivamente a la clase y sólo pueden ser usados a través de un objeto de esa clase.

Miembros de una clase


Una clase está formada por un conjunto de miembros que pueden ser datos, funciones, clases anidadas, enumeraciones, tipos de dato, etc.

Es importante señalar que un miembro no puede ser declarado más de una vez.

Tampoco es posible añadir miembros después de la declaración de la clase.

Atributos miembro


Todos los atributos que forman parte de una clase deben ser declarados dentro de la misma.

Métodos miembro


Los métodos al igual que los atributos, deber ser definidos en la clase, pero el cuerpo de la función puede ir dentro o fuera de la clase. Si un método se declara completo dentro de la clase, se considera como inline.

Para definir un método miembro de una clase fuera de la misma, se debe escribir antes del nombre del método la clase con la que el método esta asociado.

Para esto se ocupa el operador de resolución de alcance

::

Al declarar los métodos fuera de la clase no puede mencionarse la declaración de un método que no esté contemplado dentro de la clase, pues entonces cualquiera podría ganar acceso a acceso a miembros

En la POO se tiene la posibilidad de encapsular datos, es decir, ocultarlas de otros objetos si es necesario. Para esto existen dos calificadores que definen a los datos como: públicos o privados.

Miembros públicos


. Se usa cuando se quiere dar a usuarios de una clase el acceso a miembros de esa clase.

la clase con sólo declarar una función adicional

Miembros privados


. Si se quiere ocultar ciertos miembros de una clase a los usuarios de una clase, se debe declarar a los miembros como privados. Esto significa, que nadie más que los miembros de la clase pueden usar a los miembros privados.
Por omisión los miembros se consideran privados.

Acceso a miembros

Normalmente, los atributos de una clase deben tratarse como privados; así como los métodos que no sean necesarios externamente.

En el caso de los atributos, estos al ser privados deberían de contar con métodos de modificación y de consulta pudiendo incluir alguna validación.

Alcance de Clase:


El nombre de un miembro de una clase es local a la clase.

Las funciones no miembros se definen en un alcance de archivo.

Dentro de la clase los miembros pueden ser accesados directamente por todos los métodos miembros.

Fuera del alcance de la clase, los miembros de la clase se pueden acceder por el operador punto (.) de selección de miembro ó del operador flecha de selección de miembro, posterior al nombre de un objeto de clase.

Sobrecarga de operaciones:


En C++ es posible tener el mismo nombre para una método con la condición de que tenga parámetros diferentes. La diferencia debe de ser al menos en el tipo de datos.

Si se tienen dos o más métodos con el mismo nombre y diferentes parámetros se dice que dichas operaciones están sobrecargadas.

El compilador sabe que método ejecutar a través de la firma de la método, que es una combinación del nombre de la método y el número y tipo de los parámetros.

El tipo de retorno de la método puede ser igual o diferente.

La sobrecarga de métodos sirve para hacer un código más legible y modular. La idea es utilizar el mismo nombre para operaciones relacionadas.

Si no tuviera nada que ver entonces es mejor utilizar un nombre distinto.

Constructores y destructores:


Con el manejo de los tipos de datos de programación estructurada, el compilador se encarga de reservar la memoria y de liberarla cuando estos datos salen de su ámbito.

En la programación orientada a objetos, se trata de proporcionar mecanismos similares.

 Cuando un objeto es creado es llamada un método conocido como constructor, y al salir se llama a otro conocido como destructor. Si no se proporcionan estos métodos se asume la acción más simple.

Constructor


Los constructores tienen el mismo nombre que la clase, no retornan ningún valor y no pueden ser heredados. Además deben ser públicos, ya que siempre se usan desde el exterior de la clase, ni tampoco como protegido, ya que no puede ser heredado.

Un constructor es un método que se ejecuta automáticamente cuando se define o se crea un objeto.

Los constructores son métodos miembro especiales que sirven para inicializar un objeto de una determinada clase cuando se declara. Cuando una clase contiene un constructor, se garantiza que un objeto creado por la clase será inicializado automáticamente, es decir no sólo se crea el objeto sino que además, inicializa sus datos miembros.

Constructor


Un constructor que no acepta parámetros es llamado constructor predeterminado.

Las funciones constructoras tienen las siguientes características:

  • Son declaradas públicas.
  • Son invocadas de forma automática cuando los objetos son creados.
  • No tienen tipo de retorno, ni siquiera void y, por tanto, no pueden retornar ningún valor.
  • Al igual que otras funciones de C++, pueden tener argumentos predeterminados.
  • No se pueden hacer referencias a sus direcciones.
  • Realizan «llamadas implícitas» a los operadores new y delete cuando se requiere la reserva de memoria.
  • Constructores Parametrizados

  • Si una clase posee constructor, será llamado siempre que se declare un objeto de esa clase, y si requiere argumentos, es obligatorio suministrarlos.
  • El constructor entero()
    del ejemplo anterior, inicializa los datos miembro de todos los objetos a cero. Sin embrago, en la practica se hace necesaria la inicialización de distintos atributos de diferentes objetos con diferentes valores cuando estos son creados. C++ nos permite pasar argumentos a la función constructor cuando los objetos son creados. Estos constructores llamados constructores parametrizados. El constructor entero()
    puede ser modificado para que acepte argumentos :
  • Cuando no especifiquemos un constructor para una clase, el compilador crea uno por defecto sin argumentos. 
  • Cuando se crean objetos locales, los datos miembros no se inicializan, contendran «basura» que hubiese en la memoria asignada al objeto. Si se trata de objetos globales, los datos miembros se inicializan a cero.
  • Sobrecarga de constructores:


  • También pueden definirse varios constructores para cada clase, es decir, la función constructor puede sobrecargarse.
  • La única limitación es que no pueden declararse varios constructores con el mismo número y el mismo tipo de argumentos.
  • Constructores con argumentos por defecto:


  • También pueden asignarse valores por defecto a los argumentos del constructor, de este modo reduciremos el número de constructores necesarios.
  • Para resolver el ejemplo anterior sin sobrecargar el constructor suministraremos valores por defecto nulos a ambos parámetros:
  • Constructor copia:


  • Un constructor de este tipo crea un objeto a partir de otro objeto existente. Estos constructores sólo tienen un argumento, que es una referencia a un objeto de su misma clase.
  • Miembros estáticos


  • Cada objeto tiene su propio estado, sin embargo,  a veces es necesario tener valores por clase y no por objeto. En esos casos es necesario tener atributos estáticos que sean compartidos por todos los objetos de la clase.
  • Introducción

  • Estas relaciones permiten especificar jerarquías de clases en las que unas clases toman propiedades de otras.
  • A la clase superior se la llama clase base o superclase, mientras que a la que hereda las propiedades de la anterior se la llama clase derivada o subclase.
  • Lo que hace la clase derivada es heredar miembros de la clase base.
  • En C++ , incluso  una clase es posible heredar de más de una clase (herencia múltiple).

heredas clases derivadas en todas las propiedades y métodos públicos de la superclase, excepto:

  • los constructores
  • Los destructores

  • Operadores de asignación

  • Miembros estáticos

Aunque los constructores y destructores no se heredan, los constructores de las clases derivadas invocan al constructor por defecto de la clase base (salvo que se realice una llamada explícita a otro constructor de la clase base). Esa invocación se realiza antes de ejecutar el código del constructor de la clase derivada.

En el caso del destructor, siempre se ejecuta el código del destructor de la clase base antes de ejecutar el código del destructor de la clase derivada.

Miembros protected

Además de los modificadores public y private existe un tercer modificador  especialmente pensado para la herencia, se trata de protected (protegido).

Unmiembro (método o variable) de una clase definido con este modificador puede ser accedido desde las clases derivadas pero no tener acceso desde una clase (o un código)

Que no sea derivada

Clases en C++    Constructores de clases con herencia múltiple:


Análogamente a lo que sucedía con la derivación simple, en el caso de derivación múltiple el constructor de la clase derivada deberá llamar a los constructores de las clases base cuando sea necesario

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.