(Nota de estudio 1) Explicación detallada de clases y objetos (C++)

inserte la descripción de la imagen aquí

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

  1. 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;
};

  1. 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

  1. Se puede acceder directamente a los miembros modificados públicos fuera de la clase.
  2. No se puede acceder directamente a los miembros protegidos y privados modificados fuera de la clase
  3. Los derechos de acceso se abarcan desde la ocurrencia de este calificador de acceso hasta la próxima ocurrencia del calificador de acceso
  4. Si no hay un calificador de acceso, el ámbito es }, que es el final de la clase
  5. 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

  1. 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.

  1. Una clase describe un objeto y es un modelo.La clase definida no asigna espacio de memoria real.
  2. 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.

inserte la descripción de la imagen aquí

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

  1. El tipo de este puntero: el tipo de clase *const, en la función miembro, no puede asignar un valor a este puntero
  2. Solo se puede usar dentro de funciones miembro.
  3. 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.
  4. 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:
inserte la descripción de la imagen aquí
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:
inserte la descripción de la imagen aquí

7.2 Cuestiones relacionadas con este puntero

  1. ¿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.
  2. ¿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.

Supongo que te gusta

Origin blog.csdn.net/weixin_45153969/article/details/131690598
Recomendado
Clasificación