Programación orientada a objetos (OOP)
Orientado a objetos (Orientado a objetos) es un método de comprensión de los asuntos, una forma de pensar centrada en objetos
Programación orientada a objetos:
Objeto = (algoritmo + estructura de datos)
programa = objeto + objeto + …… + objeto
La programación orientada a objetos simula los métodos de comprensión y procesamiento de cosas en la naturaleza, uniendo datos y métodos operativos sobre datos para formar un objeto entero relativamente independiente. Objetos similares también pueden abstraer puntos en común y formar clases). Los datos de una clase generalmente solo se pueden procesar a través de los métodos proporcionados por esta clase, y estos métodos se convierten en la interfaz entre la clase y el exterior. Los objetos se comunican a través de mensajes.
Llamamos mensajes a la información transmitida por la interacción entre objetos.
C ++ trata "enviar un mensaje a un objeto" en "llamar a una determinada función miembro del objeto"
Concepto-objeto básico
Todas las cosas del mundo pueden llamarse Objetos. El objeto puede ser tangible, como un televisor, etc. También puede ser intangible, como una cuenta, un registro, etc.
Un objeto es una cosa objetiva independiente, que consiste en un conjunto de atributos y un conjunto de operaciones que operan sobre los atributos.
- Las propiedades son la descripción de las características estáticas del objeto.
- La operación es la descripción de las características dinámicas del objeto.
Los atributos y las operaciones son los dos elementos principales de un objeto. Por ejemplo, los atributos del televisor son: marca, tamaño, peso, etc. Las operaciones incluyen: visualización, selección de canales, ajuste de volumen, etc.
Clase de concepto básico
Una clase es un concepto abstracto que se utiliza para describir las propiedades esenciales y los comportamientos de clase compartidos por una determinada clase de objetos.
La realidad simulada resume y divide las cosas objetivas de acuerdo con principios abstractos.
Las características básicas de la orientación a objetos
- abstracto
- Encapsulación y ocultación de datos (una breve introducción)
- heredar
- Polimorfismo
Encapsulación y ocultación de datos
La encapsulación se refiere a combinar los atributos y operaciones de un objeto para formar un objeto independiente de acuerdo con el principio de protección de la información.
Al restringir los derechos de acceso a los atributos y operaciones, los atributos se pueden "ocultar" dentro del objeto, y se puede proporcionar una determinada interfaz al exterior, y el objeto solo se puede operar a través de la interfaz fuera del objeto.
La encapsulación aumenta la independencia del objeto, garantizando así la fiabilidad de los datos.
Los objetos externos no pueden manipular directamente las propiedades del objeto, sino que solo pueden utilizar los servicios proporcionados por el objeto.
Ideas de diseño abstracto
Abstracción de datos en atributos
El proceso de procesamiento se abstrae en operaciones (métodos)
-Por ejemplo: al construir un sistema de administración de bibliotecas, instintivamente sepa que debe haber objetos como bibliotecarios / lectores / libros en el sistema, y el comportamiento de los lectores incluye tomar prestados / devolver libros, Los estudiantes también tienen su correspondiente identificación de estudiante / nombre / clase, etc.
Definición de clase
C ++ admite la encapsulación y la ocultación de datos mediante el establecimiento de clases de tipos de datos. Una clase bien definida se puede utilizar como módulo independiente.
El formato de definición de la clase se divide en una parte de descripción y una parte de implementación
- la parte de descripción contiene miembros de datos y descripciones de funciones de miembros
- la parte de implementación se usa para definir funciones de miembros
El formato de definición general de una clase es el siguiente:
class <类名>
{
public :
<公有数据成员和成员函数>;
protected:
<保护数据成员和成员函数>;
private :
<私有数据成员和成员函数>;
};
class
La clave para definir la clase es el especificador del tipo de datos, <nombre de la clase> es un identificador, que se utiliza para identificar de forma única una clase (nuevo tipo de datos), la parte de las llaves después del nombre de la clase es el cuerpo de la clase (Cuerpo de la clase) .
El cuerpo de la clase define la lista de miembros de la clase (Lista de miembros de la clase)
-miembro de datos (Miembro de datos)
-función (Función de miembro)
público, protegido y privado son especificadores de acceso
Generalmente, los miembros públicos se explican primero en el cuerpo de la clase, son lo que le importa al usuario y luego se explican los miembros privados más adelante, no son de interés para el usuario, pero este orden no es necesario.
***Nota:
① Debe agregarse un punto y coma ";" después de la descripción de la clase.
②La definición de la clase se coloca en un archivo de encabezado (.h) para otros archivos que necesitan usar la clase para incluir
③La parte de implementación de la clase se coloca en un archivo fuente (.cpp), que debe incluir el archivo de encabezado que define la clase
④ La definición e implementación de la clase se puede colocar en un archivo, pero no se recomienda porque la estructura no es clara, lo que afecta la legibilidad del programa.
Miembro de datos (atributo)
Los tipos de miembros de datos en una clase pueden ser arbitrarios y se pueden definir varios tipos de variables, punteros, matrices, etc., e incluso objetos de otras clases.
Cuando se describen miembros de datos, generalmente de acuerdo con el tipo y tamaño del miembro de datos, de pequeño a grande, esto puede mejorar la utilización del espacio.
Solo los miembros de datos se pueden declarar en la definición de clase y los miembros de datos definidos no pueden inicializarse.
Los miembros de datos de la clase solo se pueden declarar en la clase, y los miembros de datos de la clase son preferiblemente privados
La función externa necesita modificarla y, por lo general, solo le proporciona una interfaz de función pública, lo que le permite acceder a los datos privados de la clase a través de la función de miembro público de la clase. Los miembros de datos también se pueden colocar en la parte pública, pero no se recomienda
Función miembro (método)
Las funciones miembro pueden usar directamente cualquier miembro en la definición de clase, pueden procesar miembros de datos y también pueden llamar a funciones miembro.
La definición de función miembro de una clase generalmente puede tomar dos formas, a saber, definición externa y definición interna (¡no se recomienda! Afecta la legibilidad del programa).
La implementación de funciones miembro generalmente se coloca fuera de la clase y el prototipo de la función se declara en la clase.
Cuando la implementación de una función miembro está fuera de la definición de una clase, debe declararse, y el nombre de la clase y el operador de alcance "::" se agregan antes del nombre de la función para indicar a qué clase pertenece una función miembro. La definición el formato es el siguiente:
返回类型 类名::成员函数名(参数说明)
{
函数体
}
La implementación de las funciones de los miembros de la clase también se puede colocar en la clase sin agregar el nombre de la clase y el operador de alcance.
Control de acceso
Tres especificadores de acceso: público, privado y protegido
Rol: controlar el acceso a los miembros de la clase
En la clase definida por clase, el método de acceso predeterminado es privado
En la definición de la clase, los tres especificadores de acceso se pueden usar varias veces (no recomendado). Su alcance es desde la aparición del especificador hasta el final antes del siguiente especificador o el final del cuerpo de la clase.
Descripción del visitante
privado: solo se puede acceder a los miembros privados de una clase mediante funciones de miembros, funciones de amigos y clases de amigos de la clase, y no se puede acceder a ellos fuera de la clase
protected: Se puede acceder a los miembros protegidos de la clase mediante las funciones miembro, funciones amigas, clases amigas y funciones miembro de clase derivadas de la clase
public: Se puede acceder directamente a los miembros públicos de la clase mediante las funciones miembro, funciones amigas y todos los códigos de programa externos de la clase amiga que pueden acceder a los objetos de la clase. Esta parte suele ser algunas operaciones (es decir, funciones miembro)
Los miembros públicos de la clase son la interfaz externa de la clase.
Función de clase
La clase define las propiedades de control de acceso de funciones (métodos) y datos (atributos)
- a los que el mundo exterior puede acceder directamente a los
miembros - a los que solo se puede acceder a los miembros mediante sus propias funciones de miembros
La tecnología de encapsulación y ocultación de información hace que la clase sea muy segura.
Solo se puede acceder a los miembros de datos privados mediante las funciones de miembros de la propia clase
Siempre que la operación de la función miembro sea razonable y legal, el objeto es seguro
Mejorar la mantenibilidad del programa.
Definición de objeto
Los objetos son instancias de clases. El objeto pertenece a una clase conocida.
Antes de definir un objeto, primero debe definir la clase del objeto.
La clase definida se puede utilizar como un nuevo tipo de datos.
La sintaxis de la declaración: 类的名称 对象的名称;
Por ejemplo:
例如:
Stack oneStack; //Stack类型的对象
Stack arrayOfStack[10]; //Stack类型的对象数组
Stack *pStack=&oneStack; //Stack类型的指针
Stack &s = oneStack; // 引用一个Stack对象
Constructor
Para la inicialización del objeto, se utiliza el constructor. Escribe uno o un conjunto de constructores. El constructor es una función miembro especial
La función del constructor: asignar espacio para el objeto; asignar valores iniciales a los miembros de datos; solicitar otros recursos.
Cómo declarar un constructor:
- El nombre de la función y el nombre de la clase son exactamente iguales
- El tipo (tipo de retorno) del constructor no se puede definir y es nulo
- El constructor debe declararse como una función pública, pero no llamarse explícitamente como otras funciones miembro: el
constructor puede tener cualquier tipo y cualquier número de parámetros, y una clase puede tener varios constructores (sobrecarga)
Al crear un objeto de una clase, el constructor de la clase se llama automáticamente
Solo se llama a un constructor cuando se crea un objeto (de acuerdo con la lista de parámetros) y solo una vez cuando se crea
Tipos de constructor
Constructor ordinario: un constructor con dos o más parámetros
Constructor predeterminado
Copiar (copiar) constructor
Constructor de conversión de tipos
Constructor sobrecargado
Cuando una clase necesita aceptar diferentes valores de inicialización, es necesario escribir varios constructores, lo que constituye una relación de sobrecarga.
Ejemplo:
class Student{
private:
char m_No[4],m_Name[21];
int m_Age,m_Score[5];
public:
Student(); //默认构造函数
Student(char *name,int age,int score[5]); //重载构造函数
};
Constructor predeterminado
-
¿Qué constructor es el constructor predeterminado?
Un constructor sin parámetros o todos los parámetros tienen valores predeterminados.
-
¿Hay un constructor predeterminado en la clase?
Si no se declara ningún constructor en la clase, el compilador generará automáticamente un constructor sin parámetros público predeterminado; si hay una declaración de constructor, entonces el compilador no generará un constructor predeterminado
-
¿Cuándo se llama al constructor predeterminado?
Cuando no se especifica que el objeto se inicialice, el objeto se inicializa de acuerdo con el constructor predeterminado.
Por ejemplo: Person p1, p2; // Usa el constructor predeterminado para inicializar p1 y p2 -
Solo puede haber un constructor predeterminado en una clase
(si todos los parámetros de un constructor tienen valores predeterminados, entonces no tiene sentido definir un constructor predeterminado sin parámetros, lo que causará ambigüedad al llamar)
Usa parámetros predeterminados en el constructor
Puede especificar los valores predeterminados de los parámetros para las funciones miembro de la clase, incluido el constructor.
Para poner el valor del parámetro predeterminado en la declaración de la función, no en la definición de la función
Si todos los parámetros de un constructor tienen valores predeterminados, entonces no tiene sentido definir un constructor predeterminado sin parámetros, lo que provocará ambigüedad al llamar.
Ejemplo:
class CCube{
public:
CCube(double len);
CCube(int len=12);
//CCube();
private:
double m_len;
};
CCube::CCube(int len){
m_len=len;}
Copiar (copiar) constructor
Constructor especial
Función: use un objeto existente para inicializar un nuevo objeto de esta clase
Declaración: solo hay un parámetro y el parámetro es una referencia a este tipo de objeto
class 类名{
public: 类名(类名 &对象名);
};
Si el constructor de copia no está especificado en la clase, el sistema genera automáticamente un constructor de copia predeterminado como miembro público de la clase.
Copia superficial y copia profunda Copia
superficial: simplemente copie el valor del miembro de datos del objeto
Copia profunda: no solo copie el valor del miembro de datos del objeto, sino que también genere un nuevo espacio para el miembro de datos del puntero y luego copie el valor correspondiente
Ejemplos:
#include <string.h>
#include <iostream.h>
class Employee
{
public:
Employee(char *n);
Employee(Employee &emp);
~Employee();
public:
char *name;
};
Employee::~Employee()
{
//析构函数
delete [] name;
}
Employee::Employee(char *n)
{
name = new char[strlen(n)+1];
strcpy(name,n);
}
Employee::Employee(Employee &emp)
{
int len=strlen(emp.name);
name=new char[len+1];
strcpy(name,emp.name);
}
int main()
{
Employee emp1("zhang");
Employee emp2(emp1);
//Employee emp2=emp1;
cout<<"emp2.name = "<<emp2.name<<endl;
return 0;
}
** Nota: Cuando el objeto contiene miembros de datos asignados dinámicamente, la implementación del constructor de copia no puede ser una simple asignación. Debe asignar nuevo espacio para los miembros de datos del objeto actual y luego copiar los datos correspondientes en el objeto de parámetro.
Otras funciones del constructor de copias
Cuando el parámetro formal de la función es el objeto de la clase, al llamar a la función, se usa cuando se combina el parámetro formal. En este momento, cree un nuevo objeto local en la memoria y copie los parámetros reales al nuevo objeto. Por supuesto, también se llama al constructor de copias.
Cuando el valor de retorno de la función es un objeto de clase, se usa cuando la ejecución de la función se completa y regresa al llamador. El motivo es crear un objeto temporal y luego volver a la persona que llama. ¿Por qué no utilizar simplemente el objeto local que se devolverá? Debido a que el objeto local muere cuando abandona la función que lo creó, es imposible sobrevivir después de regresar a la función que lo llama, por lo que al lidiar con esta situación, el sistema compilador creará un objeto temporal sin nombre en la expresión de la función que llama. Este temporal El ciclo de vida de un objeto está solo en la expresión en la llamada a la función. El llamado objeto de retorno en realidad está llamando al constructor de copia para copiar el valor del objeto en un objeto temporal. Si se devuelve la variable, el procesamiento es similar, excepto que no se llama al constructor.
Constructor de conversión
Proporciona un constructor con un solo parámetro.
Equivale a convertir un valor o variable de otro tipo en datos de su propio tipo.
Es muy peligroso que el constructor de una clase tenga solo un parámetro, porque el compilador puede usar este constructor para convertir implícitamente el tipo del parámetro al tipo de clase.
Ejemplos:
#include <string.h>
#include <iostream.h>
class CCube
{
public:
CCube(double len)
{
m_len=len;
}
public:
double m_len;
};
int main()
{
CCube cube=12.4;
cube=11; //隐式转换
cout<<"cube.m_len = "<<cube.m_len<<endl;
return 0;
}
执行结果:
cube.m_len = 11
palabra clave explícita
Palabras clave utilizadas solo para el constructor de la clase.
El compilador no usará el constructor declarado como explícito para la conversión implícita, solo puede mostrar y crear objetos en el código del programa.
#include <string.h>
#include <iostream.h>
class CCube
{
public:
explicit CCube(double len)
{
m_len=len;
}
private:
double m_len;
};
int main()
{
CCube cube = 12.4;//不允许
//cube=11;//不允许
return 0;
}
Incinerador de basuras
Función de miembro especial
Rol: Realizar trabajo de limpieza antes de revocar el objeto, generalmente para liberar el espacio solicitado dinámicamente durante la vida del objeto.
Cuando el objeto excede su alcance definido (es decir, cuando se libera el objeto), el compilador llama automáticamente al destructor.
-El objeto se define en el cuerpo de la función, cuando la función finaliza, automáticamente se llama al destructor del objeto.
-El objeto se crea dinámicamente usando el nuevo operador, cuando se usa el operador de eliminación para liberarlo, la eliminación llamará automáticamente al destructor
El nombre de la función es similar al nombre de la clase (con un carácter "~" al frente)
Nota: El destructor no tiene tipo de retorno, no tiene parámetros y el destructor no se puede sobrecargar.
Si no se define ningún destructor, el compilador generará automáticamente un destructor predeterminado con el siguiente formato:
类名::~默认析构函数名( )
{
}
El destructor predeterminado es una función vacía.
Ejemplo:
class Student
{
public:
Student();
~Student();
private:
char *m_name;
};
Student :: Student()
{
cout<<"Default constructor called"<<endl;
m_name=new char[5];
strcpy(m_name,"abc");
}
Student ::~Student()
{
cout<<"Free"<<endl;
delete []char;
}