Explicación detallada de clases y objetos (1)

Tabla de contenido

1. Comprensión preliminar de clases y objetos.

1.1 La diferencia entre orientado a procesos y orientado a objetos

1.2 Introducción de la clase

 Definiciones dentro de 1.3

1.4 Calificadores de acceso a clases y encapsulamiento

1.4.1 Calificadores de acceso

1.4.2 Embalaje

1.5 Alcance de las clases

1.6 Modelo de objeto de clase

1.6.1 Cómo calcular el tamaño del objeto de clase


1. Comprensión preliminar de clases y objetos.

1.1 La diferencia entre orientado a procesos y orientado a objetos

El lenguaje C está orientado a procesos , centrándose en el proceso , analizando los pasos para resolver el problema y resolviendo el problema paso a paso a través de llamadas a funciones.
C ++ se basa en la orientación a objetos , centrándose en objetos , dividiendo una cosa en diferentes objetos y confiando en la interacción entre objetos para completar.

Tome un ejemplo simple:

El diseño de un sistema de comida para llevar simple
está orientado al proceso: concéntrese en realizar los procesos de realizar pedidos, recibir pedidos y entregar comidas. Reflejado a nivel de código: método/función
orientado a objetos: enfoque en la implementación de objetos de clase y la relación entre objetos de clase, usuarios, comerciantes, ciclistas y la relación entre ellos. Reflejado a nivel de código: diseño de clase y relación entre clases
 

1.2 Introducción de la clase

En lenguaje C, ya hemos aprendido el tipo personalizado de estructura , usemos la estructura para definir un tipo de estudiante:

struct Student
{
	char name[10];
	int age;
	int id;
};

int main()
{
	struct Student s1; //兼容C
	Student s2;        //升级到类,Student为类名,也是类型
	return 0;
}

 Dado que C++ es compatible con la sintaxis de C, struct también se actualiza a una clase en C++. En el lenguaje C, no podemos inicializar las variables miembro después de definir las variables de estructura. Sin embargo, en C++, podemos definir funciones miembro en la estructura y, al mismo tiempo, tiempo, puede usar funciones miembro para inicializar variables de estructura y otras operaciones. Veamos cómo funciona:

struct Student
{
	//成员变量
	char _name[10];
	int _age;
	int _id;//前面加_是为了和后面函数的形参进行区分
	//成员方法
	//初始化成员变量
	void Init(const char* name, int age, int id)
	{
		strcpy(_name, name);
		_age = age;
		_id = id;
	}
	//打印成员变量
	void Print()
	{
		cout << _name << endl;
		cout << _age << endl;
		cout << _id << endl;
	}
};

int main()
{
	struct Student s1; //兼容C
	Student s2;        //升级到类,Student为类名,也是类型

	s1.Init("张三", 18, 1);
	s2.Init("李四", 19, 2);

	s1.Print();
	s2.Print();
	return 0;
}

 El resultado de la impresión:

 Definiciones dentro de 1.3

class es la palabra clave para definir una clase:

class className
{
	//类体:由成员变量和成员函数组成
};

 Entonces, ¿se puede cambiar la palabra clave struct en el código de estructura anterior a class? Solo pruébalo:

 Obviamente, el compilador nos reportó un error. No se preocupe, presentaré las razones del error una por una a continuación:

En primer lugar, la orientación a objetos tiene tres características principales: encapsulación, herencia, polimorfismo.

Lo que debemos entender primero es la encapsulación:

1. En la orientación a objetos, los datos y los métodos se juntan en la clase.

2. C++ implementa la encapsulación a través de calificadores de acceso

Los siguientes son los calificadores de acceso

1.4 Calificadores de acceso a clases y encapsulamiento

1.4.1 Calificadores de acceso

La forma de C++ para lograr la encapsulación: use la clase para combinar las propiedades y los métodos del objeto para que el objeto sea más perfecto y proporcione selectivamente su interfaz a usuarios externos a través de derechos de acceso.

 Descripción del calificador de acceso: 

1. Se puede acceder directamente a los miembros modificados públicos fuera de la clase 2. No se puede acceder directamente a los miembros modificados privados y protegidos fuera de la clase (aquí protected y private son similares) 3. El alcance de los derechos de acceso surge de este calificador de acceso La posición comienza hasta aparece el siguiente calificador de acceso 4. Si no hay ningún calificador de acceso detrás, el alcance finaliza al final de la clase. 5. El derecho de acceso predeterminado de la clase es privado (struct public porque struct es compatible con C)




 

El quinto punto aquí es que el derecho de acceso predeterminado de la clase es privado, razón por la cual el compilador de código anterior informa un error.Si establecemos la función miembro como pública (o establecemos tanto la variable miembro como la función miembro como públicas), el compilador no se informó de un error:

Por lo tanto, cuando definamos una clase, intente definir claramente el calificador de acceso en lugar de usar el calificador predeterminado de clase/estructura, para que cuando otros lean nuestro código, puedan conocer los atributos de los miembros de un vistazo.

1.4.2 Embalaje

 
La encapsulación es un tipo de gestión estricta, y la no encapsulación es un tipo de gestión libre

En C++, los datos y los métodos se encapsulan en clases, los miembros a los que puede acceder se definen como públicos y los miembros a los que no desea acceder se definen como privados.

Los beneficios de usar la encapsulación:
1. Podemos modificar nuestro propio código sin modificar los fragmentos de programa que llaman a nuestro código, lo que hace que el código sea más fácil de mantener.
2. Encapsular las variables y funciones asociadas en un objeto Las variables describen las propiedades del objeto y las funciones describen el comportamiento del objeto, lo cual está en línea con nuestra comprensión del mundo objetivo.
3. También implementa restricciones de acceso a datos sobre atributos y también fortalece la seguridad de los códigos de programa.

1.5 Alcance de las clases

Una clase define un nuevo ámbito y todos los miembros de la clase están en el ámbito de la clase. Para definir un miembro fuera de una clase, debe usar el :: analizador de alcance para indicar a qué dominio de clase pertenece el miembro

Uso en el desarrollo real de la programación modular:

 Archivo Stack.h:

#pragma once

class Stack
{
public:
	void Init();
	void Push(int x);
	// ...
//private:
	int* _a;
	int _top;
	int _capacity;
};

Archivo Stack.cpp:

#include "Stack.h"

void Stack::Init()
{
	_a = nullptr;
	_top = _capacity = 0;
}

Esto logra la separación de datos y métodos.

1.6 Modelo de objeto de clase

1.6.1 Cómo calcular el tamaño del objeto de clase

1. El cálculo del tamaño de la clase sigue el principio de alineación de la estructura

2. El tamaño de una clase está relacionado con los miembros de datos y no tiene nada que ver con las funciones de los miembros (el tamaño de la clase vacía es de 1 byte), y el tamaño de una clase no tiene nada que ver con los miembros de datos estáticos

3. La clase vacía dará un byte, este byte no almacena datos válidos, es solo para ocupar un lugar, indicando que el objeto existe

 Caso 1: Hay variables miembro y funciones miembro en la clase

class A1
{
public:
	void f1() {}
private:
	int _a;
};

  Tamaño: 4 bytes

Caso 2: Solo hay funciones miembro en la clase

class A2
{
public:
	void f1() {}
};

   Tamaño: 1 byte

Caso 3: No hay nada en la clase

class A3
{
}; ​

    Tamaño: 1 byte

Supongo que te gusta

Origin blog.csdn.net/m0_73648729/article/details/129657886
Recomendado
Clasificación