Objetos:
Un objeto es una instancia de una clase que contiene los datos y codifica todos en un paquete. Antes de OOP, se trataron código y datos como elementos separados. Un objeto es una instancia específica de una clase.
Clase:
Una clase es una colección de información relacionada que incluye datos y funciones (las instrucciones por trabajar con esos datos, también conocidos como métodos).
Encapsulación:
Los datos que se declaren en el interior del Objeto sólo serán manipulados por los métodos de ese objeto. A esto se lo conoce como encapsulación, ya que en cierta forma aísla a los datos y métodos de un objeto como si se tratase de una cápsula, impidiendo así que sean usados unos parámetros erróneos al llamar a un método o que una determinada función manipule la variable que no es. En otras palabras la encapsulación es la característica OOP que permite asociar código y datos formando objetos autosuficientes.
Partes públicas, privadas y protegidas:
Los miembros de datos de un objeto sólo deben ser manipulados por los métodos del propio objeto. Los miembros de una clase por defecto son todos privados, lo que significa que no es posible acceder a ellos desde fuera del código de la propia clase.
Las declaraciones realizadas en la definición de una clase pueden agruparse en tres apartados: public, private y protected. Las declaraciones en el apartado public serán publicas y por lo tanto otros programas o módulos podrán acceder a esos miembros. En el apartado private podemos incluir la declaración de todos aquellos miembros que no deseamos poner a disposición de terceros. Todas las variables y métodos que incluyamos en esta parte serán accesibles solo desde el propio objeto, es decir desde los métodos del objeto. Por ultimo tenemos el apartado protected, que da paso a la parte protegida del objeto, que es un paso intermedio de las dos anteriores. Los identificadores creados en la parte protegida no serán accesibles desde otros programas o módulos, pero si tendrán acceso a ellos aquellos objetos que sean derivados del nuestro.
Constructor y Destructor:
Con el fin de facilitar los procesos de inicialización y destrucción de objetos C++ dispone de métodos denominados constructores y destructores. Los constructores de una clase, pueden existir varios, son métodos cuyo nombre coincide con el nombre de la clase y se caracterizan por no tener tipo de retorno, ni siquiera void. El destructor, tan solo puede existir uno, es un método que al igual que el constructor tiene el nombre de la clase a la que pertenece, aunque en este caso precedido por una tilde. Un destructor no toma ni devuelve parámetros.
El constructor en cierta forma será el encargado de construir el objeto asignando la memoria necesaria y dándoles valores iniciales a los distintos miembros. Al declarar un objeto de la clase se llamará automáticamente al constructor adecuado, según los parámetros que se hayan facilitado. El destructor se ejecuta automáticamente cuando se libera en forma explícitamente en caso de haber sido creado dinámicamente o cuando la variable declarada sale de su ámbito.
El Objeto this:
Cuando se llama a un método, éste puede acceder a los miembros de datos del objeto que se ha utilizado para realizar la llamada. El objeto this representa al objeto que ha llamado a un método y puede ser usado como cualquier otra referencia la objeto.
Herencia:
Otra característica de OOP es la herencia, que es la reutilización de código.
A la acción de crear una clase de objeto a partir de otra clase ya existente se le llama derivación. Al tipo original se le conoce como tipo base o ascendiente, mientras que al nuevo tipo, que hereda las características del anterior se le llama tipo derivado o descendiente.
Al crear una instancia de la clase derivada se ejecuta automáticamente el constructor de la clase base. Lo mismo ocurre con el destructor.
Polimorfísmo:
Un método virtual se utiliza cuando una clase base posee un método que debe tener un comportamiento diferente en clases derivadas. Siempre que una clase derivada no contenga la lógica deseada presente en la clase base, basta implementar una nueva lógica para la misma, a través de un método o función virtual.
La idea de métodos virtuales se basa en tener un nombre para cierta acción en una clase base, y usarlo de manera diferente en clases derivadas. Cada clase derivada va a ejecutar la acción del método virtual a su propio modo, acorde con sus necesidades.
Clases Abstractas:
Hay ocasiones en que se desea que, necesariamente, un método sea redefinido en una clase descendiente. En esos casos se utiliza lo que se conoce como método abstracto donde la función se iguala a cero para que el compilador compruebe esta situación.
Un método virtual abstracto se caracteriza por ser necesariamente un método virtual y por contar tan solo con la declaración, pero no con la implementación. Si una clase tiene un metodo virtual abstracto no es posible crear un objeto de esta clase.