classes objects c
Una breve introducción a clases y objetos en C ++.
Las clases y los objetos son los componentes básicos de la programación orientada a objetos en C ++. Cada entidad, viva o no viva, puede representarse como un objeto y programarse en consecuencia utilizando C ++. Por lo tanto, entidades como un automóvil, un escritorio, una persona, un pájaro, un animal, etc. pueden representarse como objetos.
La clase es un nivel más alto que el objeto y representa la categoría de objetos. Por lo tanto, la clase actúa como un plano que describe el diseño y los detalles del objeto. Esto incluye datos que se utilizan para describir el objeto y varios métodos o funciones que pueden actuar sobre los datos del objeto.
=> Tenga cuidado con la serie de capacitación simple de C ++ aquí.
En este tutorial, discutimos todos los detalles de clases y objetos en C ++ junto con su representación programática.
Lo que vas a aprender:
- Clases
- Objetos
- Especificadores de acceso
- Constructores
- Tipos de constructores
- Operador de asignación
- destructores
- 'Este' puntero
- Conclusión
- Lectura recomendada
Clases
Una clase en C ++ puede verse como un modelo o un esqueleto de una entidad en particular. La clase es un tipo de datos definido por el usuario. Contiene la información general o los datos de esa entidad en particular y las funciones que operan en esa entidad.
En la sintaxis de C ++, definimos una clase con la palabra clave 'clase' seguida del nombre de la clase.
El nombre de la clase va seguido de los detalles de la clase entre llaves y termina con un punto y coma.
El siguiente bloque muestra la sintaxis general para la definición de clase.
Como se muestra en la representación anterior, la clase puede tener especificadores de acceso como público / protegido / privado. Puede tener miembros de datos y funciones de miembro. Los datos y las funciones se denominan miembros de la clase. De forma predeterminada, los miembros son privados para la clase, por lo que ninguna entidad externa tiene acceso a estos miembros.
Por ejemplo, un vehículo puede ser una clase generalizada que tiene propiedades como modelo, color, número de chasis, velocidad media, etc. Puede tener funciones como cambiar modelo, acelerar, ralentizar, etc. que realizan acciones en los miembros de datos. Podemos definir una clase llamada 'vehículo' que tendrá todos estos miembros de datos y funciones.
Como ya se mencionó, una clase es solo un modelo para las entidades. No ocupa ningún espacio en la memoria cuando está definido. Para que una clase sea funcional, tenemos que definir objetos que puedan hacer uso de los miembros de la clase.
Objetos
Para usar la funcionalidad de la clase, necesitamos crear una instancia de la clase para crear un objeto. Un objeto es una instancia de una clase. En palabras simples, podemos decir que un objeto es una variable de clase de tipo.
La sintaxis general para crear un objeto es:
|_+_|Una vez que se crea el objeto, se puede utilizar para acceder a los miembros de datos y funciones de esa clase.
El acceso a los miembros de la clase (datos y funciones) se realiza mediante el operador punto (.), Que también se denomina como operador de acceso a miembros.
Si obj es el nombre del objeto y hay una función 'display ()' en la clase, entonces se puede acceder a la función como 'obj.display ()'.
Sin embargo, hay una trampa en la declaración anterior. Podemos acceder a la función display () usando un objeto y el operador de punto si la función es “pública”.
Especificadores de acceso
En C ++, acceder a los miembros de datos y funciones en la clase depende del acceso dado a ese miembro de datos o función en particular usando un especificador de acceso.
C ++ admite los siguientes especificadores de acceso:
# 1) Privado
Este es el especificador de acceso predeterminado para una clase en C ++. Esto significa que si no se especifica ningún especificador de acceso para los miembros de una clase, se considera privado.
Cuando un miembro es privado, no se puede acceder a él fuera de la clase. Ni siquiera usando el objeto y el operador de punto. Solo se puede acceder a los miembros de datos privados utilizando las funciones de miembro de la clase.
cómo agregar valores a una matriz
Sin embargo, existe una excepción a esta regla, que discutiremos en nuestros temas posteriores.
# 2) Público
Un miembro de datos o función que se define como público en la clase es accesible para todos los que están fuera de la clase. Se puede acceder a estos miembros utilizando el objeto y el operador de punto.
# 3) Protegido
Un miembro protegido de una clase es accesible para la propia clase y las clases secundarias de esa clase.
Este especificador de acceso se usa especialmente en caso de herencia y lo discutiremos en detalle mientras discutimos el tema de la herencia.
Tomemos el siguiente ejemplo para comprender mejor estos especificadores de acceso.
|_+_|Producción:
var1 = 10
nombre = algo
En este programa, tenemos dos miembros de datos de los cuales var1 de tipo int es privado (especificador de acceso no especificado. El valor predeterminado es privado). Otro miembro es el nombre de la cadena, que se declara público. Tenemos otra pantalla de función que muestra el valor de ambos miembros.
En la función principal, declaramos un objeto abc de clase ABC. Luego establecemos valores para los miembros de datos y también la función de llamada se muestra usando el objeto 'abc'.
Sin embargo, cuando el compilador encuentra la línea abc.var1 = 20; generará un error de que 'var1 es una variable privada'.
Esto se debe a que no podemos acceder a datos privados de miembros de una clase fuera de la clase. Por tanto, hay un error. Pero podemos acceder a él dentro de la función y, por lo tanto, cuando generamos el valor de var1 en la función de visualización; no arroja ningún error.
Por tanto, la salida del programa muestra el valor inicial con el que se declara var1.
Hasta ahora, hemos visto los detalles sobre clases, objetos y especificadores de acceso, ahora tomemos un ejemplo completo de un estudiante de clase de muestra. Esta clase tiene miembros de datos: student_id, student_name y student_age. También tiene funciones de miembro para leer la información del estudiante y mostrar información del estudiante.
Para facilitar las cosas a los lectores, hemos declarado públicos a todos los miembros de la clase.
El siguiente programa muestra la implementación completa.
|_+_|Producción:
Ingrese la identificación del estudiante: 1
Ingrese el nombre del alumno: abc
Ingrese estudiante_edad: 12
Identificación de estudiante: 1
Nombre del estudiante: abc
Edad del estudiante: 12
Por lo tanto, tenemos una clase completa definida anteriormente. La única diferencia notable es que hemos definido una función 'print_studentInfo' dentro de la clase, mientras que otra función 'read_studentinfo' se define fuera de la clase. Estas son las dos formas en que se pueden definir funciones miembro para una clase.
Tenga en cuenta que la función que se define en el exterior todavía tiene una declaración / prototipo dentro de la clase. Además, se define fuera de la clase mediante la operador de resolución de alcance (: :) . Luego, en la función principal, creamos un objeto de clase de estudiante y luego llamamos a funciones para leer y mostrar los datos.
Constructores
Hasta ahora en este tutorial, hemos creado un objeto simple y luego asignamos valores a cada miembro de datos de la clase en la función principal después de leer estos valores de la entrada estándar.
En este tema, veremos una función especial que se usa para inicializar el objeto durante su creación. Esta función especial se llama constructor.
Un constructor es una función miembro de la clase, pero se diferencia de la función miembro normal en las siguientes formas:
- El constructor no tiene valor de retorno, es decir, el constructor nunca devuelve un valor.
- Es una función miembro pública de la clase.
- Se utiliza para inicializar los miembros de datos y construir el objeto de la clase.
- El compilador lo llama automáticamente cuando se crea el objeto.
Tipos de constructores
C ++ admite los siguientes tipos de constructores.
# 1) Constructor predeterminado
Un constructor predeterminado es el constructor básico y no tiene parámetros. Podemos crear un objeto simple sin ningún parámetro usando el constructor predeterminado.
El constructor predeterminado tiene la siguiente sintaxis:
|_+_|Si una clase no tiene un constructor predeterminado, el compilador lo crea.
# 2) Constructor parametrizado
Un constructor parametrizado es aquel que tiene una lista de parámetros con la que podemos inicializar los miembros de la clase. Cuando declaramos un objeto en un constructor parametrizado, necesitamos pasar valores iniciales a la función del constructor como parámetros.
Una función constructora parametrizada se ve como se muestra a continuación.
|_+_|Se utiliza un constructor parametrizado para sobrecargar constructores. Veremos más sobre la sobrecarga en nuestros temas posteriores.
Un constructor parametrizado se utiliza con el fin de inicializar miembros de datos de diferentes objetos. Mientras lo hacemos, podemos pasar diferentes valores de miembros de datos a diferentes objetos.
# 3) Copiar constructores
C ++ admite un tercer tipo de constructor conocido como constructor de copia. Su forma general es
preguntas de la entrevista c y c ++
classname (const classname & obj);
Como se muestra en la declaración anterior, en el constructor de copia se crea un nuevo objeto usando los valores de otro objeto de la misma clase. El parámetro que se pasa al constructor es la referencia constante de un objeto cuyos valores se utilizarán para la construcción del nuevo objeto.
Se suele llamar a un constructor de copias en las siguientes situaciones:
- Cuando un objeto de clase se devuelve por valor.
- Cuando un objeto se pasa a una función como argumento y se pasa por valor.
- Cuando un objeto se construye a partir de otro objeto de la misma clase.
- Cuando el compilador genera un objeto temporal.
Sin embargo, no podemos garantizar que se llamará al constructor de copia en todos los casos anteriores, ya que el compilador de C ++ tiene una forma de optimizar las operaciones de copia.
Un constructor de copia realiza una copia por miembros entre objetos. Al igual que el constructor predeterminado, el compilador C ++ crea un constructor de copia predeterminado si no proporcionamos uno en nuestro programa. Pero cuando una clase tiene ciertos miembros de datos como punteros, referencias o cualquier asignación de recursos en tiempo de ejecución, entonces necesitamos tener nuestro propio constructor de copia definido por el usuario.
La razón es que el constructor de copia predeterminado realiza solo una copia superficial de los miembros de datos, es decir, ambos objetos compartirán la misma ubicación de memoria. Esto está bien para miembros de datos simples que no son punteros.
Sin embargo, cuando se trata de punteros o cualquier otro miembro de datos dinámicos, nos gustaría que los datos apuntaran a una nueva ubicación de memoria. Esta es la copia profunda y solo se puede lograr utilizando un constructor de copia definido por el usuario.
A continuación se muestra un programa C ++ completo que implementa los tres tipos de constructores y su uso en la construcción de un objeto.
|_+_|Producción:
********** s **********
Identificación de estudiante: 1
Nombre del estudiante: abc
Edad del estudiante: 10
********** s2 **********
Identificación de estudiante: 2
Nombre del estudiante: xyz
Edad del estudiante: 12
La captura de pantalla del mismo se muestra a continuación.
En este programa, hemos definido un alumno de clase similar al definido en el programa anterior. La diferencia es que en lugar de leer los valores de los miembros de datos de la entrada estándar a través de una función, definimos tres constructores.
Es absolutamente posible que una clase tenga más de un constructor. Tenemos un constructor predeterminado que inicializa los miembros de datos a los valores iniciales. A continuación, definimos un constructor parametrizado que pasa valores iniciales como parámetros al constructor.
A continuación, definimos un constructor de copia al que pasamos una referencia constante a un objeto de la clase del alumno.
En la función principal, creamos tres objetos por separado usando tres constructores. El primer objeto s se crea utilizando el constructor predeterminado. El segundo objeto s1 se crea usando el constructor parametrizado mientras que el tercer objeto s2 se crea usando un constructor de copia.
Tenga en cuenta la creación del tercer objeto s2. Aquí asignamos el objeto ya creado s1 al nuevo objeto s2. Por lo tanto, cuando construimos un nuevo objeto utilizando el objeto ya existente, el compilador llama a un constructor de copia.
Operador de asignación
También podemos asignar los valores de un objeto a otro usando un operador de asignación (=). En este caso, tendremos una declaración como s1 = s.
La diferencia entre el constructor de copia y el operador de asignación es que, mientras que el constructor de copia construye un nuevo objeto en conjunto, el operador de asignación simplemente asigna los valores de un miembro del objeto en RHS a los del objeto en LHS. Esto significa que los objetos en ambos lados de un operador de asignación deben existir antes de la asignación.
destructores
Un destructor también es una función especial como un constructor, pero implementa la funcionalidad que es exactamente opuesta al constructor. Mientras que el constructor se usa para crear un objeto, un destructor se usa para destruir o eliminar un objeto.
Algunas de las características del destructor incluyen:
- El nombre de un destructor es el mismo que el de la clase pero comienza con un signo de tilde (~).
- Destructor no tiene tipo de retorno.
- Un destructor no tiene argumentos.
- Solo puede haber un destructor en una clase.
- El compilador siempre crea un destructor predeterminado si no proporcionamos uno para una clase.
La sintaxis general de un destructor es:
|_+_|El destructor de una clase se suele llamar en las siguientes situaciones:
- Cuando el objeto sale del alcance, se llama automáticamente al destructor de clases.
- De manera similar, se llama al destructor cuando el programa finaliza la ejecución. Esto significa que todos los objetos también dejan de existir. Por lo tanto, se llamará al destructor de cada objeto.
- El destructor de la clase también se llama cuando se ejecuta el operador 'eliminar' para eliminar un objeto.
- También podemos llamar al destructor explícitamente para realizar cualquier actividad de limpieza después de que hayamos terminado con la funcionalidad del objeto.
El ejemplo dado a continuación demuestra el funcionamiento de un destructor.
|_+_|Producción:
Constructor :: muestra llamada
Esta es una clase de muestra
Destructor :: ~ muestra llamada
La captura de pantalla de la salida anterior se muestra a continuación.
pasar una matriz a un método java
Hemos definido una muestra de clase en la que hemos definido un constructor, un destructor y una función de visualización. En la función principal, creamos un objeto obj de la clase muestra y luego llamamos a la función de visualización en este objeto.
Después de eso, se ejecuta un retorno 0. En la salida, podemos ver que en el momento en que la función de visualización regresa y el control del programa llega a la instrucción return 0, se ejecuta el destructor. Esto significa que se ejecuta en el momento en que el objeto sale del alcance.
'Este' puntero
C ++ utiliza un concepto especial relacionado con los objetos, que se conoce como puntero 'este'. El puntero 'this' siempre apunta al objeto actual. Así, dependiendo de la situación, siempre que tengamos que referirnos al objeto actual, usamos el puntero 'this'.
Sabemos que cada vez que se crea una instancia de la clase, es decir, un objeto, se realiza una copia separada de los miembros de datos de la clase para el objeto. Pero cuando se trata de las funciones miembro de la clase, todos los objetos comparten la misma copia.
Entonces, cuando uno o más objetos acceden a las funciones miembro simultáneamente, ¿cómo nos aseguramos de que las funciones miembro accedan y modifiquen los miembros de datos adecuados?
Este es el lugar donde entra en acción “este” puntero. El compilador pasa un puntero implícito con el nombre de la función como 'esto'. Esto se denomina puntero 'esto'.
El puntero 'this' se pasa como un argumento oculto a todas las llamadas de función miembro. Suele ser una variable local. Por lo tanto, 'este' puntero es un puntero constante y su contenido es la dirección de memoria del objeto actual.
Tenga en cuenta que este puntero está disponible solo para funciones miembro no estáticas y no para funciones estáticas. Esto se debe a que no es necesario acceder a las funciones estáticas mediante un objeto. Se puede acceder directamente a ellos utilizando el nombre de clase.
Usualmente usamos el puntero 'this' en situaciones donde las variables miembro y los parámetros se pasan para inicializar las variables miembro que comparten el mismo nombre. También lo usamos cuando necesitamos devolver el objeto actual de la función.
Veamos la demostración de 'este' puntero a continuación.
|_+_|Producción:
num = 100
ch = A
En el programa anterior, tenemos una clase llamada Sample, con dos miembros de datos num y ch. Tenemos una función miembro setParam que pasa los parámetros con los mismos nombres, num y ch para establecer los valores de las variables miembro.
Dentro de la función, asignamos estos valores a las variables miembros del objeto actual indicadas por este puntero. Una vez que se establecen los valores, el objeto actual 'esto' se devuelve de la función.
En la función principal, primero creamos un objeto de la clase Sample, obj y llamamos a una función setParam para establecer los valores y luego llamamos a la función printValues para imprimir los valores.
Conclusión
Hemos aprendido los bloques de construcción básicos de OOP en C ++ en este tutorial. Comprender las clases y los objetos son los requisitos principales, para empezar, POO en C ++. También hemos aprendido sobre los constructores y destructores en detalle con ejemplos.
En nuestro próximo tutorial, aprenderemos sobre las listas de inicializadores en C ++.
=> Tenga cuidado con la serie de capacitación simple de C ++ aquí.
Lectura recomendada
- Conceptos de Python OOP (clases, objetos y herencia de Python)
- Tutorial de interfaz Java y clase abstracta con ejemplos
- Trabajar con objetos de Excel de VBScript
- Tutorial # 7 de QTP - Paradigma de identificación de objetos de QTP - ¿Cómo identifica QTP los objetos de forma única?
- Repositorio de objetos en QTP - Tutorial n. ° 22
- Trabajar con objetos de conexión VBScript ADODB
- Polimorfismo en tiempo de ejecución en C ++
- Herencia en C ++