Mi informacion de contacto
Correo[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Tabla de contenido
Orientado a procesos y orientado a objetos.
Programación orientada a objetos
Formato de definición de clase
2. Calificadores de acceso a clases y encapsulación.
Características de este puntero
La programación orientada a procesos es una idea de programación centrada en procesos. En la programación orientada a procesos, un programa se ve como una colección de funciones o procedimientos que se ejecutan en un orden determinado para completar una tarea específica.
ventaja:
- Rendimiento eficiente : Debido a que la programación orientada a procesos ejecuta tareas directamente de acuerdo con el proceso y no requiere una creación y administración excesiva de objetos, tiene una mayor eficiencia de ejecución en algunos escenarios con mayores requisitos de rendimiento, como la programación del sistema subyacente, la programación integrada, etc. Por ejemplo, en el núcleo del sistema operativo, la programación orientada a procesos se puede utilizar para optimizar mejor el rendimiento para la implementación de funciones como la programación de procesos y la gestión de memoria.
- lógica clara : Para una lógica de programa simple, se implementa paso a paso de acuerdo con el proceso. La estructura lógica del código es clara y fácil de entender, fácil de entender y mantener. Por ejemplo, un programa simple que calcula la suma de dos números puede definir directamente una función para el cálculo mediante programación orientada a procesos.
defecto:
- Mala mantenibilidad : Cuando el tamaño del programa aumenta y las funciones se vuelven complejas, el código orientado a la programación procedimental puede resultar difícil de mantener y ampliar. Debido a que el acoplamiento entre varias funciones es alto, modificar una función puede afectar otras funciones relacionadas.
- Reutilizabilidad de código baja: La reutilización del código generalmente se logra mediante llamadas a funciones, pero para módulos funcionales complejos, la reutilización es más difícil y las funciones no se pueden encapsular ni abstraer bien.
La programación orientada a objetos es una idea de programación centrada en objetos. Un objeto es una entidad que contiene datos (propiedades) y métodos (comportamientos) para manipular esos datos. Al encapsular datos y métodos relacionados en un objeto, se logra la integración de datos y operaciones.
ventaja:
- Alta mantenibilidad : Encapsula funciones en objetos, ocultando la implementación interna de los objetos del mundo exterior y reduciendo el acoplamiento entre módulos. Cuando es necesario modificar una función, solo es necesario modificar la implementación interna del objeto correspondiente sin afectar otras partes no relacionadas. Por ejemplo, en una aplicación de interfaz gráfica, si desea modificar la función de un botón, solo necesita modificar el método correspondiente del objeto del botón sin afectar otros elementos de la interfaz.
- Fuerte reutilización del código : La reutilización y expansión del código se puede lograr fácilmente mediante herencia, polimorfismo y otras características.Por ejemplo, cree una clase base
Shape
(forma) y luego derivarCircle
(redondo),Rectangle
(Rectángulo) y otras subclases, las subclases pueden reutilizar los atributos y métodos de la clase base y realizar extensiones específicas.- Buena flexibilidad: La programación orientada a objetos admite el polimorfismo, lo que permite al programa seleccionar y ejecutar dinámicamente los métodos correspondientes de acuerdo con el tipo real del objeto durante el tiempo de ejecución, lo que aumenta la flexibilidad y escalabilidad del programa.
defecto:
- Gastos generales de rendimiento: Dado que la creación de objetos, la llamada a métodos y otras operaciones requieren una cierta cantidad de sobrecarga, en algunos escenarios con requisitos de rendimiento extremadamente altos, puede afectar la eficiencia de ejecución del programa.
- Alto costo de aprendizaje: Los conceptos y características de la programación orientada a objetos son relativamente complejos, lo que dificulta su aprendizaje y comprensión para los principiantes.
• clase es la palabra clave que define la clase, Datos es el nombre de la clase y {} es el cuerpo de la clase. Tenga en cuenta que el punto y coma final no se puede omitir al final de la definición de clase. Los contenidos del cuerpo de la clase se denominan miembros de la clase: las variables de la clase se denominan atributos o las variables miembro de la clase las funciones de la clase se denominan métodos o funciones miembro de la clase.
• Para distinguir las variables miembro, generalmente se acostumbra agregar un identificador especial a la variable miembro, como comenzar con _ o m antes o después de la variable miembro. Tenga en cuenta que esto no es obligatorio en C++, son solo algunas convenciones. .
• En C++, struct también puede definir clases. C++ es compatible con el uso de struct en C. Al mismo tiempo, struct se ha actualizado a una clase. El cambio obvio es que las funciones se pueden definir en struct. Se recomienda utilizar class para definir clases.
• Las funciones miembro definidas en una clase están en línea de forma predeterminada.
class Date { public: void Init(int year, int month, int day) { _year = year; _month = month; _day = day; } private: // 为了区分成员变量,⼀般习惯上成员变量 // 会加⼀个特殊标识,如_ 或者 m开头 int _year; // year_ m_year int _month; int _day; }; int main() { Date d; d.Init(2024, 3, 31); return 0; }
• La clase define un nuevo ámbito. Todos los miembros de la clase están en el ámbito de la clase. Al definir miembros fuera de la clase, es necesario utilizar el operador ::scope para indicar a qué dominio de clase pertenece el miembro.
• El dominio de clase afecta las reglas de búsqueda de compilación. Si Init en el siguiente programa no especifica el dominio de clase Stack, el compilador tratará a Init como una función global. Luego, durante la compilación, no se puede realizar la declaración/definición de miembros como una matriz. encontrado, se informará un error. Especificar el dominio de clase Stack significa saber que Init es una función miembro. Si no se pueden encontrar miembros como una matriz en el dominio actual, se buscarán en el dominio de clase.
- #include<iostream>
- using namespace std;
- class Stack
- {
- public:
- // 成员函数
- void Init(int n = 4);
- private:
- // 成员变量
- int* array;
- size_t capacity;
- size_t top;
- };
- // 声明和定义分离,需要指定类域
- void Stack::Init(int n)
- {
- array = (int*)malloc(sizeof(int) * n);
- if (nullptr == array)
- {
- perror("malloc申请空间失败");
- return;
- }
- capacity = n;
- top = 0;
- }
- int main()
- {
- Stack st;
- st.Init();
- return 0;
- }
• C++ es una forma de implementar la encapsulación, utilizando clases para combinar las propiedades y métodos de un objeto para hacerlo más completo y proporcionar selectivamente sus interfaces a usuarios externos a través de permisos de acceso.
• Se puede acceder directamente a los miembros modificados por public fuera de la clase; no se puede acceder directamente a los miembros modificados por protected y private fuera de la clase. Sus diferencias se reflejarán en el capítulo sobre herencia más adelante.
• El alcance de los permisos de acceso comienza desde la posición donde aparece el calificador de acceso hasta que aparece el siguiente calificador de acceso. Si no hay ningún calificador de acceso posterior, el alcance termina en }, es decir, la clase.
• Cuando un calificador de acceso no modifica un miembro de definición de clase, su valor predeterminado es privado.
• la estructura por defecto es pública
• Generalmente, las variables miembro estarán restringidas a privadas/protegidas, y las funciones miembro que deban ser utilizadas por otros se harán públicas.
Las tres características principales de la orientación a objetos: encapsulación, herencia y polimorfismo.
En la etapa de clases y objetos, estudiamos principalmente las características de encapsulación de las clases. Entonces, ¿qué es la encapsulación?
Encapsulación: combine orgánicamente datos y métodos de operación de datos, oculte las propiedades y los detalles de implementación del objeto y solo exponga la interfaz para interactuar con el objeto.
La encapsulación es esencialmente un tipo de gestión que facilita a los usuarios el uso de las clases. Por ejemplo: para un dispositivo complejo como una computadora, lo único que se proporciona al usuario son las teclas de encendido y apagado, la entrada del teclado, el monitor, el conector USB, etc., lo que le permite interactuar con la computadora y completar las tareas diarias. Pero, de hecho, el verdadero trabajo de la computadora es la CPU, la tarjeta gráfica, la memoria y otros componentes de hardware.
Los usuarios de computadoras no necesitan preocuparse por los componentes centrales internos, como cómo están dispuestos los circuitos en la placa base, cómo está diseñada la CPU, etc. Los usuarios solo necesitan saber cómo encender la computadora y cómo encenderla. interactuar con la computadora a través del teclado y el mouse. Por lo tanto, cuando los fabricantes de computadoras salen de fábrica, colocan una carcasa en el exterior para ocultar los detalles de implementación interna y solo proporcionan interruptores de alimentación, conectores para mouse y teclado en el exterior para que los usuarios puedan interactuar con la computadora.
Para implementar la encapsulación en el lenguaje C++, los datos y los métodos para operar datos se pueden combinar orgánicamente a través de clases, y se pueden usar permisos de acceso para ocultar los detalles de implementación interna de los objetos y controlar qué métodos se pueden usar directamente fuera de la clase.
• El proceso de crear un objeto en la memoria física usando un tipo de clase se llama creación de instancias de clase.
• Una clase es una descripción abstracta de un objeto. Es algo así como un modelo, que limita las variables miembro de la clase. Estas variables miembro sólo se declaran y no asignan espacio cuando se crea una instancia de un objeto. clase.
• Una clase puede crear instancias de múltiples objetos. Los objetos instanciados ocupan espacio físico real y almacenan variables miembro de la clase. Por ejemplo: crear instancias de objetos de una clase es como usar dibujos de diseño arquitectónico para construir una casa en la realidad. Una clase es como un dibujo de diseño. El dibujo de diseño planifica cuántas habitaciones hay, el tamaño y las funciones de las habitaciones, etc. No es un objeto físico. Incluso si existe un edificio, no puede albergar personas. Sólo cuando una casa se construye utilizando dibujos de diseño se puede albergar. La misma clase es como un dibujo de diseño y no puede almacenar datos. El objeto instanciado asigna memoria física para almacenar datos.
¿Analizar qué miembros hay en el objeto de clase? Cada objeto instanciado por una clase tiene un espacio de datos independiente, por lo que el objeto debe contener variables miembro. Entonces, ¿se incluyen las funciones miembro? Primero, después de compilar la función, es una sección de instrucciones que no se pueden almacenar en el objeto. Estas instrucciones se almacenan en un área separada (segmento de código), por lo que si deben almacenarse en el objeto, solo se pueden almacenar. punteros a funciones miembro. Analicemos nuevamente, ¿es necesario almacenar punteros en el objeto? La fecha crea una instancia de dos objetos d1 y d2. Tanto d1 como d2 tienen sus propias variables miembro independientes _año/_mes/_día para almacenar sus propios datos, pero la función miembro Init/Print. Los punteros de d1 y d2 son los mismos, por lo que almacenarlos en objetos es un desperdicio. Si usa Date para crear instancias de 100 objetos, entonces el puntero de la función miembro se almacenará 100 veces, lo cual es un desperdicio. De hecho, no es necesario almacenar el puntero de función. El puntero de función es una dirección. La función de llamada se compila en una instrucción de ensamblaje [dirección de llamada]. , no en tiempo de ejecución. Solo se encuentra polimorfismo dinámico en tiempo de ejecución y es necesario almacenar las direcciones de funciones.
Arriba analizamos que solo las variables miembro se almacenan en los objetos. C ++ estipula que los objetos instanciados por clases también deben cumplir con las reglas de alineación de memoria.
Reglas de alineación de la memoria
Las reglas de alineación de la memoria son exactamente las mismas que las del lenguaje C.Artículo de referencia:Lenguaje C para calcular la alineación de la memoria.
El primer miembro está en la dirección desplazada 0 de la estructura.
• Otras variables miembro deben asignarse a direcciones que sean múltiplos enteros de un número determinado (número de alineación).
• Nota: Logaritmo = el menor entre el número de alineación predeterminado del compilador y el tamaño del miembro.
•El logaritmo predeterminado en VS es 8
• El tamaño total de la estructura es: un múltiplo entero del número máximo de alineación (el mayor de todos los tipos de variables y el parámetro de alineación predeterminado más pequeño).
• Si una estructura está anidada y la estructura anidada está alineada con un múltiplo entero de su propio logaritmo máximo, el tamaño total de la estructura es el número de alineación máximo de todos (incluido el número de alineación de la estructura anidada).
Si no hay ninguna variable miembro se debe dar 1 byte, porque si no se da ni un byte ¿cómo se puede demostrar que el objeto ha existido? Por lo tanto, aquí se proporciona 1 byte únicamente para la identificación como marcador de posición de la existencia del objeto.
Hay dos funciones miembro, Init e Print, en la clase Date. No hay distinción entre diferentes objetos en el cuerpo de la función. Entonces, cuando d1 llama a las funciones Init e Print, ¿cómo sabe la función si debe acceder al objeto d1 o? el objeto d2?Luego aquí veremos que C++ proporciona un puntero this implícito para resolver el problema aquí.
• Después de que el compilador compila, las funciones miembro de la clase agregarán un puntero del tipo de clase actual, llamado este puntero, a la primera posición del parámetro formal de forma predeterminada. Por ejemplo, el prototipo real de la clase Init of Date es,void Init(Fecha* const this, int año, int mes, int día) • Cuando se accede a variables miembro en funciones miembro de clase, se accede a ellas esencialmente a través de este puntero. Por ejemplo, cuando se asigna un valor a _año en la función Init, esto. - >_año = año;
• C++ estipula que este puntero no se puede escribir explícitamente en la posición de los parámetros reales y los parámetros formales (el compilador lo manejará durante la compilación), pero este puntero se puede usar explícitamente en el cuerpo de la función.
- #include<iostream>
- using namespace std;
- class Date
- {
- public:
- // void Init(Date* const this, int year, int month, int day)
- void Init(int year, int month, int day)
- {
- // 编译报错:error C2106: “=”: 左操作数必须为左值
- // this = nullptr;
- // this->_year = year;
- _year = year;
- this->_month = month;
- this->_day = day;
- }
- void Print()
- {
- cout << _year << "/" << _month << "/" << _day << endl;
- }
- private:
- // 这⾥只是声明,没有开空间
- int _year;
- int _month;
- int _day;
- };
- int main()
- {
- // Date类实例化出对象d1和d2
- Date d1;
- Date d2;
- d1.Init(2024, 7, 1); // d1.Init(&d1, 2024, 7, 1);
- d1.Print(); // d1.Print(&d1);
- d2.Init(2024, 7, 10); // d2.Init(&d2, 2024, 7, 10);
- d2.Print(); // d2.Print(&d2);
- return 0;
- }