Diseño y uso orientado a objetos de C ++

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.
Inserte la descripción de la imagen aquí

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 :
        <私有数据成员和成员函数>;
};

classLa 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;
}

Supongo que te gusta

Origin blog.csdn.net/qq_46485161/article/details/115315916
Recomendado
Clasificación