Clases y objetos C ++ (1) Introducción de clases

Tabla de contenido

1. El concepto de clase

En segundo lugar, la introducción de la clase.

3. Definición de clase 

1. Definir una clase

2. La diferencia entre estructura y clase.

3. La declaración e implementación de la separación de funciones miembro en la clase.

4. Calificadores de encapsulación y acceso a clases.

1. Encapsulación

2. Calificadores de acceso a clases       

5. Alcance de la clase y ciclo de vida

6. Creación de instancias de la clase.

【concepto】

1. Creación implícita

2. Creación explícita

3. Nueva creación explícita

7. Métodos de almacenamiento de clases y objetos.

1. Conjetura del método de almacenamiento de funciones miembro

2. La distribución de miembros de la clase en la memoria.  

3. La ubicación de almacenamiento de la clase en la memoria.

4. La ubicación de almacenamiento del objeto en la memoria.

3.1 Objetos globales

3.2 Objetos locales

3.3 Objetos locales estáticos

3.4 Objetos dinámicos

[demostración de código] 

 【Diseño de memoria】

Ocho, calcula el tamaño de la clase.


1. El concepto de clase

1. ¿Qué es?

        Es una abstracción de cosas que tienen las mismas propiedades y comportamientos.


2. ¿Por qué?

        Junte los datos y funciones relacionados para facilitar la administración, y las clases son la premisa de la programación orientada a objetos.


3. ¿Cómo usarlo?

        Junte los atributos y comportamientos (implementados por funciones) de las cosas que se describirán para formar una clase.


En segundo lugar, la introducción de la clase.

1. La estructura se actualiza a una clase.        

        En C++, struct no solo es compatible con la sintaxis de estructuras en lenguaje C, sino que también se actualiza a una clase en C++.


2. Las funciones se pueden definir en la clase.
        La clase contiene dos partes, variables miembro y funciones miembro. Entonces, en C++, no solo se pueden definir variables en la estructura, sino que también se pueden definir funciones.


3.class también puede definir clases

        Además de struct, class también se puede usar para definir clases en C++, y class se usa más comúnmente para definir clases en C++ .

Extensión: la sutil diferencia entre struct en C y C++

1. En C, use typedef para cambiar el nombre de la estructura, y entrará en vigor después de la última línea. El nombre de la estructura utilizado en la estructura también debe ir acompañado de struct.


2. En C++, el nombre de la clase se puede usar directamente en la clase sin siquiera usar el cambio de nombre de typedef.


3. Definición de clase 

1. Definir una clase

class className //法一
{
 // 类体:由成员函数和成员变量组成
 
}; // 一定要注意后面的分号

struct structName //法二
{
 // 类体:由成员函数和成员变量组成
 
}; // 一定要注意后面的分号
        class (o struct) es la palabra clave para definir la clase, className (structName) es el nombre de la clase y {} es el cuerpo de la clase. Tenga en cuenta que el punto y coma después del final de la definición de clase no se puede omitir.
        Los contenidos del cuerpo de la clase se denominan miembros de la clase: las variables de la clase se denominan atributos o variables miembro de la clase ; las funciones de la clase se denominan métodos o funciones miembro de la clase .

2. La diferencia entre estructura y clase.

En C++, se puede usar struct o class para definir una clase. La diferencia entre los dos es que
        si no se agrega ningún calificador, struct es pública de forma predeterminada y la clase es privada de forma predeterminada.

extensión: calificador de acceso a clase       

3. La declaración e implementación de la separación de funciones miembro en la clase.

a. La declaración y la implementación de las funciones miembro se colocan en el cuerpo de la clase. Nota: Si la función miembro está definida en la clase , el compilador puede tratarla como una función en línea .

B. La declaración de la función miembro se coloca en el archivo .h y la implementación de la función miembro se coloca en el archivo .cpp.
(Nota: cuando la declaración y la implementación están separadas, debido a que la declaración está en el dominio de la clase, el nombre de la clase y el calificador de alcance del dominio (::) deben agregarse antes del nombre de la función miembro durante la definición para encontrar la clase ) .

        

En proyectos a gran escala, se recomienda separar la declaración y la implementación de las funciones miembro en la clase como funciones ordinarias. La importancia de separar la declaración y la definición de las funciones miembro en la clase es facilitar la lectura del código .

Extensión 1. Si una función miembro está definida en una clase , el compilador puede tratarla como una función en línea .

        Una vez separadas la declaración y la implementación, las funciones miembro de la clase ya no se considerarán funciones en línea. (La declaración y la implementación de la función en línea no se pueden separar, la función en línea no ingresará a la tabla de símbolos y la dirección de implementación no se puede encontrar en la declaración al vincular)


Extensión 2. Cuando la declaración y la definición están separadas: si no agregamos el nombre de dominio de la clase al definir, entonces aparecerán dos funciones con el mismo nombre en el dominio de clase y en el dominio global, lo cual es factible y no constituye sobrecarga de funciones. ( Las funciones en diferentes dominios no constituyen sobrecarga )   


4. Calificadores de encapsulación y acceso a clases.

1. Encapsulación

1. ¿Qué es?

        Es esencialmente la gestión de datos: los detalles de implementación de los atributos y métodos del objeto están ocultos, solo la interfaz está expuesta al mundo exterior y se controla el nivel de acceso para leer y modificar atributos en el programa.


2. ¿Por qué?

        Mejorar la seguridad y mantenibilidad del programa ( facilidad de mejora ).


3. ¿Cómo hacerlo?

         La forma en que C ++ logra la encapsulación: use una clase para combinar atributos y métodos, y proporcione selectivamente su interfaz a usuarios externos estableciendo permisos de acceso. 

2. Calificadores de acceso a clases       

público (público), privado (privado), protegido (protegido)


5. Alcance de la clase y ciclo de vida

1. El alcance de la clase.

         Una clase define un nuevo ámbito y todos los miembros de la clase están dentro del ámbito de la clase. Al definir miembros fuera de la clase, debe utilizar el operador de alcance :: para indicar a qué dominio de clase pertenece el miembro . 


2. Ciclo de vida de la clase

        El ciclo de vida de una clase está relacionado con la ubicación de almacenamiento. Por ejemplo, las clases globales y las clases estáticas se almacenan en el área estática, y su ciclo de vida es todo el proyecto. El ciclo de vida de una clase en una función sigue a esta función. ..


6. Creación de instancias de la clase.

【concepto】

El proceso de creación de un objeto con una clase se llama creación de instancias de la clase. Una clase puede crear instancias de múltiples objetos.


        La clase no ocupa espacio y ocupará espacio después de crear una instancia en un objeto, que se utiliza para almacenar variables miembro de la clase . Pero también podemos calcular el tamaño del espacio ocupado por el objeto a través de la clase.

        De la misma manera, definir una estructura no ocupa espacio, solo definir una variable de estructura ocupará espacio, pero también podemos usar el tamaño del nombre de la estructura para calcular el espacio que ocupa una variable de estructura. 

1. Creación implícita

Creado en la pila llamando al constructor predeterminado por el compilador.

class A{};
A a;

2. Creación explícita

Llame activamente al constructor en el código y créelo en la pila.

class A{};
A a = A();

3. Nueva creación explícita

La nueva palabra clave se utiliza para asignar la creación de memoria en el montón.

class A{};
A* pa = new A();

El nuevo objeto debe ser recibido mediante un puntero y el objeto debe eliminarse explícitamente para liberar la memoria.


7. Métodos de almacenamiento de clases y objetos.

1. Conjetura del método de almacenamiento de funciones miembro

Conjetura 1 del método de almacenamiento de funciones miembro: almacene tanto la dirección de la función miembro como la variable miembro

Hay un problema: las funciones miembro que se llamarán son todas iguales, por lo que no es necesario almacenar la dirección de una función miembro para cada objeto.


Conjetura 2 del método de almacenamiento de funciones miembro: almacene la dirección de la función miembro en una tabla por separado y luego almacene la dirección de una tabla adicional al almacenar

No hay nada de malo en este enfoque, pero no se utiliza aquí.


Conjetura 3 sobre el método de almacenamiento de funciones miembro: solo se almacenan las variables miembro y las funciones miembro se almacenan uniformemente en el área de código público.

Este esquema es el esquema de almacenamiento de funciones miembro . La dirección de la función no se encontrará en el objeto en tiempo de ejecución, y la dirección de la función se encontrará en el área de código público de acuerdo con el nombre de la función al compilar y vincular.

Entonces, cuando la clase encuentre las siguientes situaciones, el programa no fallará. (Debido a que la dirección de la función miembro no se encuentra en la clase, se encuentra en el área de código público, por lo que la clase se instancia como nullptr y aún podemos llamar a la función miembro)

 

2. La distribución de miembros de la clase en la memoria.  

1) Variables miembro ordinarias en la clase ------------ pila
2) Variables miembro estáticas en la clase ------------ área estática
3) Variables de referencia en la clase ------------ Mire la variable referenciada
4) variable constante en la clase ------------ pila (la modificación constante solo limita la variable a solo lectura, la La esencia sigue siendo Variable, la ubicación de almacenamiento depende de la variable en sí, por lo que la variable local modificada por const todavía está en la pila y se puede modificar mediante el puntero).

5) Funciones miembro de clase ------------ Las funciones miembro ordinarias y las funciones miembro estáticas están todas en el área de código

3. La ubicación de almacenamiento de la clase en la memoria.

        La clase no se almacenará en la memoria, la clase es solo una plantilla para decirle al programa cómo crear un objeto, cuántos bytes se necesitan y cómo destruirlo.

        Los objetos instanciados a partir de una clase se almacenan en la memoria.

4. La ubicación de almacenamiento del objeto en la memoria.

3.1 Objetos globales

        El objeto global se almacena en el área de almacenamiento global (estático) y el destructor de llamadas al sistema lo libera una vez finalizado el programa.


3.2 Objetos locales

        Los objetos locales se almacenan en la pila . Su vida termina cuando finaliza el alcance y su destructor se llama automáticamente, es decir, el objeto se limpia automáticamente.


3.3 Objetos locales estáticos

        Los objetos locales estáticos se almacenan en el área de almacenamiento global (estático) y su vida aún existe después de que finaliza el alcance, es decir, el destructor del objeto no se llamará en este momento hasta el final de todo el programa.


3.4 Objetos dinámicos

        Los objetos dinámicos (es decir, objetos nuevos) se almacenan en el montón y su vida finaliza cuando se eliminan. Los punteros utilizados para crear objetos dinámicos se almacenan en la pila.
        Nota: Para objetos nuevos, debe usar eliminar para llamar explícitamente al destructor; de lo contrario, el programa no llamará a su destructor, lo que provocará pérdidas de memoria.


[demostración de código] 
class A{
};
class B{
};
class C{
};
class D{
};

A a;  //全局对象
int main(){
	B b;  //局部对象
	static C c;  //静态局部对象
	D *d = new D;  //动态对象
	delete d;
	return 0;
}

 【Diseño de memoria】


Ocho, calcula el tamaño de la clase.

1. Calcule el tamaño de la variable miembro.

        Al igual que la estructura, la clase también obedece las reglas de alineación de la memoria. A partir de la segunda variable miembro, se debe calcular la posición inicial. Elija la más pequeña entre su propio tamaño y el número de alineación predeterminado (el número de alineación predeterminado en el compilador VS es 8) el uno. Finalmente, toda la clase también debe estar alineada: el tamaño de la clase debe ser un múltiplo entero de la alineación predeterminada.

        Cuando sizeof calcula el tamaño de la clase, ignora el tamaño de las variables miembro estáticas.

2. Calcule el tamaño de la función miembro.

        Al calcular el tamaño de una clase, las funciones miembro no se consideran, por lo que no es necesario agregar el tamaño del puntero de función.

3. Calcula el tamaño de la clase vacía.

        Tenga en cuenta que una clase sin variables miembro (incluidas las clases vacías) tiene un tamaño de 1 byte y no almacena datos, el propósito es ocupar espacio, identificar la existencia de objetos y distinguir diferentes objetos.


Resumir:

Calcular el tamaño de una clase es calcular el tamaño de todas las variables miembro (no estáticas)          de la clase de manera alineada con la memoria .

Supongo que te gusta

Origin blog.csdn.net/look_outs/article/details/129029360
Recomendado
Clasificación