clases y objetos
1. Definición de clase
Una clase es una sintaxis exclusiva de un lenguaje orientado a objetos. En un lenguaje orientado a objetos, todas las variables y funciones se denominan colectivamente objetos, y puede haber objetos en una clase.
gramática
class ClassName
{
// 类体:由成员函数和成员变量组成
void Init();
int a;
};
//class为定义类的关键字,ClassName为类名,{}中为类的主题,注意类定义结束时后面分号不能省略。
//类中的内容称为类的成员:类的变量称为类的属性或成员变量;类中的函数称为类的方法或者成员函数。
Cómo se define la clase
- La declaración y la definición se colocan en el cuerpo de la clase (nota: si la función miembro está definida en la clase, el compilador puede llamarla)
// 成员函数声明定义都在类中
class xty
{
public:
void Print()
{
cout << "defined in class" << endl;
}
private:
int a;
int b;
};
- La declaración de la clase se coloca en el archivo .h y la función miembro se define en el archivo .cpp. Nota: antes de definir el nombre de la función miembro, debe agregar el nombre de la clase:
// .h文件
class xty2
{
public:
//声明
void Print();
private:
int a;
int b;
};
// .cpp定义
void xty2::Print()
{
cout << "defined in class" << endl;
}
En la práctica de proyectos de ingeniería, se recomienda tratar las declaraciones y definiciones por separado.
Hay una declaración que indica que la sintaxis es correcta y se puede compilar; si hay una definición, la dirección se puede encontrar de acuerdo con la tabla de símbolos al vincular y se puede vincular
2. Calificadores de acceso a clases
Calificador de acceso: 1.public (público), 2.protected (protegido), 3.private (privado)
2.1 Características de los calificadores de acceso
- Se puede acceder directamente a los miembros modificados públicos fuera de la clase.
- No se puede acceder directamente a los miembros protegidos y privados modificados fuera de la clase
- Los derechos de acceso se abarcan desde la ocurrencia de este calificador de acceso hasta la próxima ocurrencia del calificador de acceso
- Si no hay un calificador de acceso, el ámbito es }, que es el final de la clase
- El permiso de acceso predeterminado de class es privado y struct es público (porque struct es compatible con C)
class Xty
{
public:
void Print()
{
cout << "defined in class" << endl;
}
private:
int a = 10;
int b;
int c;
};
int main()
{
//声明xp对象
Xty xp;
xp.a = 10; //报错,因为a 为私有,所以对xp.a不可访问
int z = xp.a; //报错,因为a 为私有,所以对xp.a不可访问
xp.Print(); //可以运行,Print成员函数为公有,因此可以在类外面访问
return 0;
}
El propósito de esto es establecer las variables miembro como privadas y las funciones miembro como públicas para evitar que los miembros externos modifiquen arbitrariamente las variables miembro.
2.2 La diferencia entre estructura y clase
- En primer lugar, struct es una palabra clave del lenguaje C. Para ser compatible con la sintaxis de C, C++ hace que el permiso predeterminado de la clase struct sea público, de modo que se pueda acceder a través de objetos fuera de la clase, mientras que la clase es privada por defecto, y fuera de la clase no se puede acceder casualmente.
3. Tres características principales
C++ tiene tres características principales: herencia, encapsulación y polimorfismo.
3.1 Paquete
Combine orgánicamente los datos y el método de operación de los datos, oculte los atributos y los detalles de implementación del objeto, e interactúe solo con el objeto a través de la interfaz expuesta al mundo exterior. La encapsulación es esencialmente un tipo de gestión que permite a los usuarios utilizar las clases de forma más segura y cómoda.
4. Ámbito de clase
Una clase define un nuevo ámbito y todos los miembros de la clase están en el ámbito de la clase. Al definir miembros fuera de una clase, debe usar el :: calificador de alcance.
class Xty
{
public:
void Print();
private:
int a = 10;
int b;
int c;
};
//在类外面定义成员时,需加上域名,来说明Print是属于Xty这个域里面的
void Xty::Print()
{
cout << "hello world!" << endl;
}
5. Instanciación de la clase
La creación de una clase a partir de un tipo se denomina instanciación de la clase.
- Una clase describe un objeto y es un modelo.La clase definida no asigna espacio de memoria real.
- Una clase puede instanciar (crear) varios objetos, y los objetos ocupan el espacio físico real y almacenan las variables de los miembros de la clase.
class Xty
{
public:
void Print();
int a;
int b;
int c;
};
//在类外面定义的成员函数
void Xty::Print()
{
cout << "hello world!" << endl;
}
int main()
{
//Xty的类创建出xp的对象
Xty xp;
//是给xp的对象赋值,而不是给类赋值
xp.a = 10;
xp.b = 20;
xp.Print();
return 0;
}
6. Modelo de objeto de clase
¿Cómo almacena el compilador los objetos?
Veamos primero un ejemplo de código:
//类中既有成员变量又有成员函数
class X1
{
public:
void Print()
{
cout << "hello world" << endl;
}
private:
char a;
};
//类中只有成员变量
class X2
{
private:
int a;
};
//类中什么也没有
class X3
{
};
int main()
{
X1 x1;
X2 x2;
X3 x3;
cout<<"x1 : " << sizeof(x1) << endl; // 1
cout<<"x2 : " << sizeof(x2) << endl; // 4
cout<<"x1 : " << sizeof(x3) << endl; // 1
return 0;
}
Se puede ver a partir de la observación que las variables miembro del objeto ocupan el espacio de almacenamiento, pero las funciones miembro no ocupan el espacio del objeto, y cuando no hay nada en el objeto de clase, se usa 1B para ocupar el espacio, indicando que el objeto existe.
De hecho: las variables miembro y las funciones miembro se almacenan por separado, solo las variables miembro ocupan el espacio de almacenamiento del objeto, y las funciones miembro de todos los objetos de esta clase se almacenan en el área de código común, y todos los objetos comparten el código.
7. este puntero
Primero observe el siguiente fragmento de código:
class Time
{
public:
void Init(int h, int min, int s)
{
_h = h;
_min = min;
_s = s;
}
void Print()
{
cout << _h << ":" << _min << ":" << _s << endl;
}
private:
int _h;
int _min;
int _s;
};
int main()
{
Time t1;
Time t2;
t1.Init(10, 20, 3);
t2.Init(5, 10, 1);
t1.Print(); // 10:20:3
t2.Print(); // 5:10:1
}
Debido a que la función miembro está en el área pública, y la función miembro tiene la función Imprimir y la función Init, ¿cómo sabe C++ cuando llama a la función t1.Init(), cómo sabe si quiero usar el objeto t1 o el objeto t2?
Respuesta: El compilador de C++ agrega un parámetro de puntero oculto a cada "función miembro no estática", haciendo que el puntero apunte al objeto actual (el objeto que llama a la función cuando la función se está ejecutando) y todas las "variables miembro" en el cuerpo de función Joder, se accede a todos a través de este puntero. Es solo que todas las operaciones son transparentes para el usuario, es decir, el usuario no necesita pasarlo y el compilador lo completa automáticamente.Este puntero es el "este puntero".
7.1 Características de este puntero
- El tipo de este puntero: el tipo de clase *const, en la función miembro, no puede asignar un valor a este puntero
- Solo se puede usar dentro de funciones miembro.
- La esencia del puntero this es el parámetro formal de la función miembro. Cuando el objeto llama a la función miembro, la dirección del objeto se pasa como parámetro real a este parámetro formal. Entonces, el puntero this no se almacena en el objeto.
- El puntero this es el primer parámetro de puntero oculto de la "función miembro". Generalmente, el compilador lo pasa automáticamente a través del registro ecx y no es necesario que lo pase el usuario.
El puntero this existe, pero el compilador lo hace automáticamente por nosotros. Podemos usarlo o no
Los parámetros reales y los parámetros formales no se pueden pasar y aceptar explícitamente en este puntero, y se informará un error (no se puede compilar). Como se muestra en la figura a continuación:
Pero el puntero this se puede usar dentro de la función miembro (se puede compilar), como se muestra en la figura a continuación:
7.2 Cuestiones relacionadas con este puntero
- ¿Dónde existe este puntero? El puntero this es un parámetro formal, y el parámetro formal se almacena en el área de la pila.
- ¿Puede este puntero ser nulo? El puntero this puede estar vacío.Al acceder a una función miembro, irá directamente al área pública para encontrar la función, y no encontrará la función a través de la desreferencia, por lo que no desreferenciará el puntero nulo, por lo que puede hacerlo.