Tabla de contenido
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
Protección de datos compartidos
Creación dinámica y lanzamiento de objetos.
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 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