Programación C ++ [Tan Haoqiang] Parte 3: Programación basada en objetos

Tabla de contenido

Capítulo 8 Clases y objetos

Descripción general de los métodos orientados a objetos

Declaración de clase y definición de objeto

Referencia al miembro de objeto

Encapsulación de clases y ocultación de información

Capítulo 9 Discusión adicional sobre clases y objetos

Constructor

Incinerador de basuras

Matriz de objetos

Puntero de objeto

Protección de datos compartidos

Creación dinámica y lanzamiento de objetos.

Asignación y copia de objetos

Miembro estático

Tomomoto

Plantilla de clase

Capítulo 10 Sobrecarga del operador

¿Qué es la sobrecarga del operador?

Métodos y reglas de sobrecarga de operadores

Funciones sobrecargadas del operador como funciones de miembros de clase y funciones de amigos

Operador binario sobrecargado

Operador unario sobrecargado

Operador de inserción de flujo de sobrecarga y operador de extracción de flujo

Conversión entre diferentes tipos de datos

Conversión de tipos con función de conversión de tipos


Capítulo 8 Clases y objetos

Descripción general de los métodos orientados a objetos

Orientado a procesos: adecuado para programas de escala relativamente pequeña, de hecho, está orientado a realizar cada función una por una, programa = algoritmo + estructura de datos

Orientado a objetos: adecuado para programas relativamente a gran escala, orientado a objetos encapsulados por datos y funciones, programa = múltiples objetos + mensajes [objeto = algoritmo + estructura de datos]

Objeto: cualquier cosa específica en el mundo externo puede verse como un objeto específico en C ++, el objeto consiste en datos y composición de funciones

Atributos: las características estáticas del objeto, como el número de estudiantes en la clase y el aula.

Comportamiento: las características dinámicas del objeto, como una reunión de clase, etc. El comportamiento está controlado por el mensaje

Encapsulación: una es encapsular datos y código en un objeto, y la otra es ocultar algunas partes del objeto desde el exterior

Abstracción: una clase es una abstracción de un objeto, una clase es una plantilla de un objeto, un objeto es un caso especial de una clase o un objeto es una manifestación concreta de una clase.

Herencia y reutilización: la herencia es la capacidad de usar la clase anterior para expandir algunas funciones para generar una nueva clase, la reutilización es la reutilización del software.

Polimorfismo: envía el mismo mensaje a diferentes objetos y realizan diferentes acciones, respectivamente, llamadas polimorfismo.

Declaración de clase y definición de objeto

Las clases son abstractas y no ocupan memoria, mientras que los objetos son específicos y ocupan memoria, de hecho, una clase es una estructura de datos en un sentido amplio.

El método de declaración de la clase también se desarrolla a partir del tipo de estructura. En C ++, los dos incluso se pueden usar en común. La diferencia es que la clase predeterminada es privada cuando no se especifica, y la estructura predeterminada es pública, pero intente usar la clase para crear la clase, privada y pública es el calificador de acceso de miembros

La clase encapsula los datos y la operación. En términos generales, la clase oculta los datos y usa la función miembro como interfaz externa.

Precauciones para el uso de funciones de clase: preste atención a los permisos de llamada, preste atención al alcance de la función (qué rango de datos y funciones puede llamar)

La función miembro en público es la interfaz externa de la clase, la función miembro en privado es la función de utilidad de otros miembros de la clase y los usuarios fuera de la clase no pueden llamar

Las funciones miembro también se pueden definir fuera de la clase, por ejemplo:

class Student
{
    public:
        void display();
    private:
        int num;
        string name;
        char sex;
};

void Student::display()
{
    cout<<num<<endl;
    cout<<name<<endl;
    cout<<sex<<endl;
}

Student stu1, stu2;

Preste atención a cómo se define la función miembro anterior: void Student :: display (), donde los dos dos puntos :: representan que esta función pertenece al miembro de la clase de la clase antes de los dos dos puntos. Si solo hay estos dos dos puntos, O nada, entonces esta función no es una función miembro, sino una función global

El espacio ocupado por un objeto solo está relacionado con el espacio ocupado por los miembros de datos del objeto, y no tiene nada que ver con las funciones miembro, lo que significa que el espacio para almacenar funciones en la clase se guarda

Referencia al miembro de objeto

Tres formas de hacer referencia a los miembros de una clase

(1) Nombre del objeto. Nombre del miembro

stu.num

(2) Utilice punteros:

pStu->num     //方式一
(*pStu).num   //方式二

(3) Referencia de uso: stu2 es un alias de stu1, ambos se refieren al mismo fragmento de memoria

Student stu1;
Studnet &stu2 = stu1;

Para C ++, siempre que la clase esté bien definida, el trabajo de escribir un programa es muy, muy simple

Encapsulación de clases y ocultación de información

El papel de la clase es encapsular datos y algoritmos en los tipos de datos abstractos declarados por el usuario. El usuario implementa principalmente las funciones proporcionadas por la clase llamando a funciones miembro públicas (como asignar valores a miembros de datos, mostrar los valores De miembros de datos y procesamiento de datos). Espere)

Separación de la interfaz pública y la implementación privada: Por ejemplo, en el proceso de desarrollo de software, se debe realizar la separación de las dos. De esta manera, mientras la interfaz de la clase no cambie, el cambio a la implementación privada será no afectar a otras partes del programa

Si un programa usa una clase de conocimiento, entonces la declaración de la clase y la definición de las funciones miembro se pueden escribir directamente al comienzo del programa, pero si la clase es usada por varios programas, la cantidad de trabajo repetitivo es demasiado grande. Generalmente, en el desarrollo orientado a objetos, la práctica común es colocar la declaración de la clase (incluida la declaración de las funciones miembro) en el archivo de encabezado. Si el usuario desea usar esta clase, simplemente envuelva este archivo de encabezado en. Al mismo tiempo, para el ocultamiento de la información, las funciones de los miembros de la clase generalmente no se colocan en el archivo de encabezado, sino que se colocan en una consulta separada.

Un ejemplo de la separación de la declaración de clase y la definición de función miembro [tres archivos en total]:

Archivo 1: Declaración de clase en el archivo de encabezado:

//文件名:student.h
//这是个类声明头文件
#pragma once          
#include <string>
using namespace std;

class Student          //类声明
{
public:
	void display();   //公用成员函数声明
private:
	int num;
	string name;
	char sex;
};

Archivo 2: la definición de funciones miembro de clase

//文件名:student.cpp
#include <iostream>
#include "student.h"         //注意包含这个类声明头文件
using namespace std;
 //在本文件中进行函数的定义
void Student::display()      //注意这里的两个冒号很重要
{
	cout << num << endl;
	cout << name << endl;
	cout << sex << endl;
}

Archivo 3: función principal

//文件名:main.cpp
#include <iostream>
#include "student.h"    //包含这个类声明头文件
using namespace std;

int main()
{
	Student stu;        //定义一个对象
	stu.display();      //执行对象的display函数,这里你点那个点就会发现其它的成员都访问不了
	return 0;
}

¿Para quién? Stu

¿Quién es el método? mostrar()

¿Quién es la noticia? stu.display ()

 

Capítulo 9 Discusión adicional sobre clases y objetos

Constructor

En pocas palabras, el constructor debe manejar la inicialización del objeto. Cabe señalar que los miembros de datos de la clase no se pueden inicializar cuando se declara la clase, porque la clase es solo un tipo de datos, no un objeto real.

Ejemplos de constructores:

#include <iostream>
using namespace std;
class Time
{
public:
	Time()  //定义构造成员函数,函数名与类名相同,通过构造函数对对象中的数据成员赋初值
	{
		hour = 0;
		minute = 0;
		sec = 0;
	}
	void set_time();
	void show_time();
private:
	int hour;
	int minute;
	int sec;
};

//定义成员函数用于赋值
void Time::set_time()
{
	cin >> hour;
	cin >> minute;
	cin >> sec;
}

//定义成员函数用于输出
void Time::show_time()
{
	cout << hour << ':' << minute << ':' << sec;
}

//主函数
int main()
{
	Time t;        //建立对象t,同时调用构造函数t.Time()进行对象初始化
	//t.set_time();
	t.show_time();
	return 0;
}

Además, la tabla de inicialización de parámetros se puede utilizar para inicializar los miembros de datos.

Sobrecarga de constructores: se pueden definir varios constructores en una clase para proporcionar diferentes opciones de inicialización para objetos de clase. Estos constructores tienen el mismo nombre, pero el número de parámetros o los tipos de parámetros son diferentes, lo que se denomina sobrecarga de constructores, pero una clase tiene solo un constructor predeterminado

Incinerador de basuras

Hay un símbolo ~ delante del destructor. Su función es opuesta a la del constructor. La función del destructor no es eliminar el objeto, sino completar un trabajo de limpieza antes de que el objeto ocupe memoria. Una clase puede tener muchos constructores (sobrecarga), pero solo un destructor. Construido primero y luego destruido, construido después, destruido primero, similar a una pila

Matriz de objetos

Las matrices pueden estar compuestas no solo por variables simples, sino también por objetos

Puntero de objeto

La primera dirección del espacio ocupado por el objeto es el puntero del objeto.

(1) Puntero al miembro de datos en el objeto

El método de definición es el mismo que el de la estructura.

(2) Punteros a miembros funcionales en el objeto

Variables de puntero de funciones ordinarias: void (* p) (); donde p es una variable de puntero que apunta a funciones de tipo void

Variable puntero que apunta a la función miembro del objeto: void (Time :: * p) (); donde p es la variable puntero que apunta a la función miembro pública de la clase Time

¿Cómo definirlo? Por ejemplo: p = & Time :: get_time; Tenga en cuenta que get_time aquí es solo el nombre de la función, sin paréntesis

Protección de datos compartidos

Para asegurarse de que los datos se puedan compartir dentro de un rango determinado, pero también para asegurarse de que no se modifiquen arbitrariamente, puede usar const para definir los datos relevantes como una constante

Creación dinámica y lanzamiento de objetos.

Ejemplos de creación y liberación de objetos dinámicamente: [similar a malloc () y free ()]

Box * pt;      //定义一个 Box * 类型的指针变量 pt
pt = new Box;  //在 pt 中存放新建的对象的首地址
delete pt;     //释放 pt 所指向的内存空间

Asignación y copia de objetos

Copiar = Nuevo + Asignar

Miembro estático

Miembro de datos estáticos

Si desea que un determinado miembro de datos en cada objeto sea coherente, puede definirlo en la clase de la siguiente manera:

static int height;

Función de miembro estático

Similar a los miembros de datos estáticos

static float sum();

Tomomoto

Amigo es algo entre público y privado. Si hay una función definida fuera de esta clase (puede ser una función no miembro o una función miembro de otras clases), entonces use friend para declarar esta función en el cuerpo de la clase. Esta función se llama función friend de esta clase Esta función de amigo puede acceder a los miembros privados de esta clase.

Por ejemplo:

#include <iostream>
using namespace std;
class Time
{
public:
	Time(int,int,int);
	friend void display(Time &);   //声明display为Time类的友元函数
private:
	int hour;
	int minute;
	int sec;
};

//定义构造函数用于赋初值
Time::Time(int h,int m,int s)
{
	hour = h;
	minute = m;
	sec = s;
}

//定义成员函数用于输出
void display(Time & t)  //t是Time类对象的引用,这个函数是友元函数
{
	cout << t.hour << ':' << t.minute << ':' << t.sec;
}

//主函数
int main()
{
	Time t(10,13,20);  
	display(t);   //t是Time类对象
	return 0;
}

Plantilla de clase

Ejemplos de uso de plantillas de clases:

#include <iostream>
using namespace std;
template <class numtype>
class Compare
{
public:
	Compare(numtype a, numtype b)
	{
		x = a;
		y = b;
	}
	numtype max()
	{
		return(x > y) ? x : y;
	}
	numtype min()
	{
		return(x < y) ? x : y;
	}
private:
	numtype x, y;
};

int main()
{
	Compare <int> cmp_1(3, 7);
	cout << cmp_1.max() << " is the max of two numbers" << endl;
	Compare <float> cmp_2(45.6, 98.7);
	cout << cmp_2.min() << " is the min of two numbers" << endl;
	return 0;
}

 

Capítulo 10 Sobrecarga del operador

¿Qué es la sobrecarga del operador?

La llamada sobrecarga es para darle un nuevo significado. La sobrecarga de funciones es una función multipropósito, el mismo nombre de función se puede usar para representar funciones de diferentes funciones; la sobrecarga de operadores se usa en realidad todo el tiempo (por ejemplo, usamos + para realizar operaciones con enteros, números de punto flotante, etc. ., de hecho, esto es una sobrecarga del operador)

La llamada sobrecarga de operadores es para darles un nuevo significado a los operadores.

Métodos y reglas de sobrecarga de operadores

 

Funciones sobrecargadas del operador como funciones de miembros de clase y funciones de amigos

 

Operador binario sobrecargado

 

Operador unario sobrecargado

 

Operador de inserción de flujo de sobrecarga y operador de extracción de flujo

 

Conversión entre diferentes tipos de datos

 

Conversión de tipos con función de conversión de tipos

 

Supongo que te gusta

Origin blog.csdn.net/weixin_43450646/article/details/106996297
Recomendado
Clasificación