C ++ esta operación de puntero

Resuma los puntos de conocimiento relevantes de este puntero aquí.

  En primer lugar, todos sabemos que las funciones miembro de la clase pueden acceder a los datos de la clase (el calificador está limitado a algunas operaciones fuera de la clase, todo en la clase es transparente para la función miembro), entonces ¿cómo sabe la función miembro qué datos del objeto? Los miembros deben manipularse porque cada objeto tiene un puntero: este puntero, a través de este puntero para acceder a su propia dirección. Nota: Este puntero no es parte del objeto, el tamaño de memoria ocupado por este puntero no se reflejará en el operador sizeof. El tipo de este puntero depende del tipo de función miembro y del tipo de objeto que usa este puntero, (1) Si el tipo de este puntero es Stu_Info_Mange (se toma prestado el tipo de la clase en el siguiente caso de prueba), y si Las funciones miembro no son constantes , el tipo de esto es: Stu_Info_Mange * tipo constante , (2) es un puntero constante (constante) a un objeto Stu_Info_Mange no constante, si la función miembro es un tipo constante, el tipo de este puntero es un puntero El puntero const del objeto constStu_Info_Mange. Un poco alrededor, entiéndelo con cuidado.

 

 

Dos: el concepto común de este puntero

Esto solo se puede usar en funciones miembro. Las funciones globales, las funciones estáticas no pueden usar esto. De hecho, las funciones miembro predeterminadas para el primer parámetro T * const registran esto.

¿Por qué no se puede usar este puntero en funciones estáticas?

  Como puede comprender de esta manera, una función estática es como una variable estática. No pertenece a un objeto específico. La función estática representa información en el sentido de toda la clase, pero este puntero en realidad corresponde a un objeto, por lo que este puntero ciertamente no puede Lo utilizan las funciones estáticas. Lo mismo es cierto para las funciones globales. Lo entiendo de esta manera. No sé cómo lo entiendes. Puedes comentarlo e intercambiarlo.

 

(1): ¿Cuándo se creó este puntero?

Esto se construye antes del inicio de la ejecución de la función miembro y se borra después de la ejecución del miembro.

 

(2) ¿Cómo se pasa este puntero a la función en la clase? Enlace? O el primer parámetro del parámetro de la función es este puntero. Entonces, ¿cómo encuentra este puntero la función después de la instancia de clase?

  Esto se pasa a través del primer parámetro del parámetro de función. Este puntero se genera antes de la llamada. La función después de la instancia de clase no tiene esta declaración. Cuando se instancia la clase, solo se asigna el espacio variable en la clase y no se asigna espacio para la función. Como la definición de la función de la clase se ha completado, estará allí y no se ejecutará.

 

(3) Este puntero solo se define en las funciones miembro. Por lo tanto, después de obtener un objeto, no puede usar este puntero a través del objeto. Por lo tanto, no podemos conocer la posición del puntero this de un objeto (la posición de este puntero solo está disponible en las funciones miembro). Por supuesto, en las funciones miembro, puede conocer la posición de este puntero (disponible con & this), o puede usarlo directamente.

 

 

Tres: el uso de este puntero:

Un caso es que cuando el objeto de clase en sí mismo se devuelve en la función miembro no estática de la clase, podemos usar el operador de punto (* this)., El operador de flecha this->, además, también podemos devolver aproximadamente * this Referencias, para que podamos realizar operaciones en "cascada" como flujos de entrada y salida.

El texto es muy aburrido de entender, no tan directo como el ejemplo, daremos algunos ejemplos prácticos para analizar.

  Creamos una clase de información para estudiantes, las cosas específicas son muy claras y el código,

 

[cpp]  ver copia simple imprimir ?

  1. #include <iostream>  
  2. #include <cadena>  
  3. usando el espacio de nombres estándar;  
  4. clase Stu_Info_Mange  
  5. {  
  6.     int sno;  
  7.     nombre de cadena;  
  8.     int edad;  
  9.     int grado;  
  10. público:  
  11.     Stu_Info_Mange (int s = 0, cadena n = "", int a = 0, int g = 0)  
  12.     {  
  13.         sno = s;  
  14.         sname = n;  
  15.         edad = a;  
  16.         grado = g;  
  17.     }  
  18.     setsid void (int sn) // Use este puntero para la asignación  
  19.     {  
  20.         this-> sname = sn;  
  21.     }  
  22.     int Setage (int a)  
  23.     {  
  24.         esta-> edad = a;  
  25.         return (* this) .age; // Use este puntero para devolver la antigüedad del objeto  
  26.     }  
  27.     impresión vacía ()  
  28.     {  
  29.         cout << "el nombre es" << this-> sname << endl; // Se accede explícitamente a este puntero a través del operador de flecha  
  30.         cout << "el sno es" << sno << endl; // Usa implícitamente este puntero para imprimir  
  31.         cout << "la edad es" << (* this) .age << endl; // Usa explícitamente este puntero para pasar el operador de punto lejano  
  32.         cout << "el grado es" <<este-> grado << endl << endl;  
  33.     }  
  34.   
  35. };  
  36. int main ()  
  37. {  
  38.     Stu_Info_Mange sim1 (761, "Zhang San", 19, 3);  
  39.   
  40.     sim1.print (); // Información de salida  
  41.   
  42.     sim1.Setage (12); // Use este puntero para modificar la edad  
  43.   
  44.   
  45.     sim1.print (); // salida de nuevo  
  46.     devuelve 0;  
  47. }  

 

 

 

     En el ejemplo anterior, queremos establecer la información de un estudiante, necesitamos llamar a la función miembro a la que pertenece cada variable relacionada (el nombre llama a la función miembro que establece el nombre ...), también podemos usar otra función de esta para permitirle Para lograr la conexión en cascada, es conveniente que llamemos, para esto, modificamos el código anterior de la siguiente manera:

 

[cpp]  ver copia simple imprimir ?

  1. #include <iostream>  
  2. #include <cadena>  
  3. usando el espacio de nombres estándar;  
  4. clase Stu_Info_Mange  
  5. {  
  6.     int sno;  
  7.     nombre de cadena;  
  8.     int edad;  
  9.     int grado;  
  10. público:  
  11.     Stu_Info_Mange (int s = 0, cadena n = "", int a = 0, int g = 0)  
  12.     {  
  13.         sno = s;  
  14.         sname = n;  
  15.         edad = a;  
  16.         grado = g;  
  17.     }  
  18.     <span style = "color: # ff0000;"> Stu_Info_Mange & </ span> Setsname (string s) // <span style = "color: # ff0000;"> Todas las funciones relacionadas devuelven la referencia del objeto, así Se puede conectar en cascada para facilitar la codificación </ span>  
  19.     {  
  20.         this-> sname = s;  
  21.         <span style = "color: # ff0000;"> return (* this); </span>  
  22.     }  
  23.     <span style = "color: # ff0000;"> Stu_Info_Mange & </span> Setsno (int sno)  
  24.     {  
  25.         esto-> sno = sno;  
  26.         <span style = "color: # ff0000;"> return * this </span>;  
  27.     }  
  28.     <span style = "color: # ff0000;"> Stu_Info_Mange & Setgrade (</span> int grade)  
  29.     {  
  30.         esto-> grado = grado;  
  31.         <span style = "color: # ff0000;"> return * this; </span>  
  32.     }  
  33.     <span style = "color: # ff0000;"> Stu_Info_Mange & </span> Setage (int age)  
  34.     {  
  35.         esto-> edad = edad;  
  36.         <span style = "color: # ff0000;"> return * this; </span>  
  37.     }  
  38.     impresión vacía ()  
  39.     {  
  40.         cout << "el nombre es" <<este-> nombre << endl;  
  41.         cout << "el sno es" <<este-> sno << endl;  
  42.         cout << "la edad es" <<esta-> edad << endl;  
  43.         cout << "el grado es" <<este-> grado << endl << endl;  
  44.   
  45.     }  
  46. };  
  47. int main ()  
  48. {  
  49.     Stu_Info_Mange sim; // Usar parámetros predeterminados  
  50.     <span style = "color: # ff0000;"> sim.Setsname ("张三") .Setsno (457) .Setgrade (2012) .Setage (20); // 级联 </span>  
  51.     // Use este puntero para hacer posibles las llamadas a funciones en serie  
  52.   
  53.     sim.print ();  
  54.        
  55.     devuelve 0;  
  56.   
  57. }  


   

 

 

 

  Aquí se resumirán algunos conceptos sobre este puntero. Ahora estudiaremos el manual de C ++. Si hay algo nuevo, podemos mejorarlo LuchaLucha.

150 artículos originales publicados · 79 elogiados · 630,000 vistas +

Supongo que te gusta

Origin blog.csdn.net/liu0808/article/details/88414304
Recomendado
Clasificación