2012-07-07 20 views
8

estoy poco nuevo en C++ y tratar de resolver las cosas con Qt y encontré este confuso cosa:C++ punteros a objetos de clase y acceso a funciones miembro

los conceptos en los diversos tutoriales estado algo como:

Class *obj; 

*obj - mostrará el valor del objeto almacenado en la memoria mencionado
obj - será la dirección de la memoria a la que está apuntando

así, lo haría somethi ng como

*obj=new Class(); 

pero si quiero acceder a una función, que tengo que hacer obj->function1(); en lugar de *obj->function1();

- no sé por qué, ya que con objetos normales [normalObj.function1();] funcionaría, ya que es el valor directamente.

Por lo tanto, para los objetos de puntero ¿Por qué usamos referencia de memoria para acceder a la función, o es que en el caso de los objetos normales también, su siempre hace referencia a

PD: Alguien me puede guiar a un buen tutorial de uso de punteros en C++, para que mis consultas como estas se puedan abordar directamente en él.

+1

[ “un buen tutorial de punteros en C++”] (http://dl.dropbox.com/u/6101039/Modern%20C%2B%2B .pdf) –

Respuesta

23

El símbolo * se usa para definir un puntero y para desreferenciar un puntero.Por ejemplo, si quería crear un puntero a un int, lo que podía hacer:

int *ptr;

En este ejemplo, el * se está utilizando para declarar que éste es un puntero a un int . Ahora, cuando no está declarando un puntero y usa el símbolo * con un puntero ya declarado, está desreferenciándolo. Como probablemente sepa, un puntero es simplemente una dirección. Cuando desreferencia un puntero, está obteniendo el valor al que apunta esa dirección. Por ejemplo:

int pointToMe = 5; 
int *ptr = &pointToMe; 
std::cout << *ptr; 

Esto imprimirá 5. Además, si está asignando un puntero a una nueva dirección y no es en la declaración, no lo hace usar el símbolo *. Entonces:

int pointToMe = 5; 
int *ptr; 
ptr = &pointToMe; 

es cómo lo harías. También puede deferenciar el puntero para asignar un nuevo valor al valor señalado por la dirección. Tales como:

int pointToMe = 5; 
int *ptr = &pointToMe; 
std::cout << *ptr; // Prints out 5 
*ptr = 27; 
std::cout << *ptr; // Prints out 27 

Ahora, -> actúa como el símbolo deferencia. Desreferenciará el puntero y luego usará las funciones y variables de miembros como si hubiera usado . con un objeto que no sea puntero. Incluso con un objeto que no es un puntero puede utilizar el -> por conseguir primero la dirección:

CObj object; 
(&object)->MemberFunction(); 

Eso es sólo una breve descripción de los punteros, espero que ayude.

+1

Gracias por explicar el -> operador –

3

En realidad, te equivocas. Lo haces:

obj=new Class(); 

o

Class *obj = new Class; 

que son completamente diferentes.

Class *obj; 
*obj = new Class; 

no compiladas.

obj es del tipo Class*, entonces eso es lo que puede asignarle (y lo que new Class devuelve).

3

Puede usar el . "normal" para acceder a los miembros de los objetos, pero primero debe desviar el puntero.

Debido a la precedencia del operador, esto se verá como (*obj).member. Para aquellos que piensan que esto es demasiado para escribir, obj->member es una alternativa más corta.

Si usted tiene un objeto de tipo cClass, *c.ptr medios de eliminación de referencias ptr un puntero que es miembro de Class. Esa es una razón para (*obj).member, lo que significa algo más.

0

Más precisamente, u puede hacer como esto

Class obj; 
Class* obj_ptr; 

obj_ptr = &obj; 

// Now onwards you can use the pointer to access data members and function 

obj_ptr->a = 10; // Like this 
Cuestiones relacionadas