2010-05-29 6 views
7

duplicados posibles:
C++: ptr->hello(); /* VERSUS */ (*ptr).hello();
Why does C have a distinction between -> and . ?¿Cuál es el motivo de la diferencia entre -> y. en c/C++?

que conocen la diferencia entre el operador y el país miembro por el operador puntero (->) (.).

¿Por qué los diseñadores de C crearon un operador diferente para este acceso? ¿Por qué el compilador no puede resolverlo por sí mismo?

Si siempre usó a. ¿Existe algún caso donde sea ambiguo si se refiere a un miembro o miembro por puntero?

editar: No estoy buscando la sintaxis "(* a) .b". Pregunto por qué los diseñadores no te permitieron usar "a.b" en lugar de "a-> b".

+0

La notación proviene originalmente de C. –

+0

punto bueno: Cambié la pregunta para usar C en lugar de C++. –

+0

posible duplicado de [C++: ptr-> hello();/* VERSUS */(* ptr) .hello();] (http://stackoverflow.com/questions/447543/c-ptr-hello-versus-ptr-hello) y [cuál es la diferencia entre (.) operador punto y (->) flecha en C++] (http://stackoverflow.com/questions/1238613/what-is-the-difference-between-dot-operator-and-arrow-in-c) –

Respuesta

0

Cuando tiene un lenguaje que, en esencia, pretende ser un "ensamblador portátil", no intenta ocultar los detalles de implementación del usuario. Por supuesto, el compilador puede darse cuenta de que en la expresión a.b, el a en cuestión es un puntero. ¿Puedes? ¿Seguramente? ¿Todo el tiempo? ¿En código peludo y complicado?¿Y no puedes imaginar una circunstancia en la que no ser capaz de notar rápidamente que a es un puntero podría ser un problema?

Deje de pensar en términos de "difícil de escribir" y comience a pensar en términos de "fácil de leer". (Sí, lo sé. ¡Esto va en contra de todo el mito del programador C!) Leerás el código un par de órdenes de magnitud con más frecuencia de lo que lo estarás escribiendo.

6

¿Realmente quieres que el compilador "lo resuelva solo?" Si así fuera, entonces el siguiente evaluaría a lo mismo (suponiendo p es un puntero a una estructura con un miembro de x):

(*p).x; 
p.x 

Si el desreferenciar del puntero está implícito allí, debería ser implícita en todas partes? Considere:

int* p; 
int i = p; // should dereferencing be implicit here as well? 

Creo que sería mucho más confuso que tener dos operadores separados.

También puede ser útil tener dos operadores para ayudar a realizar un seguimiento de la cantidad de capas de indirección que tiene. Por supuesto, el operador -> no es estrictamente necesario para esto, ya que p->x es equivalente a (*p).x, pero hace que el código sea un poco más claro y fácil de leer.

+0

también tendrá que considerar lo que debería suceder cuando se involucran niveles adicionales de indirección: ¿desea permitir que el compilador elimine los punteros 'struct' de profundidad arbitraria al usar' .', o restringirlo a un máximo de uno nivel de indirección? Ninguna de las soluciones me parece "correcta" ... – Christoph

+0

Bueno, como esto (solo '.' para' -> 'y' :: ') es como se hace en algunos idiomas, es posible. Y parece que las personas que vienen a C o C++ de esos idiomas encuentran que es confuso tener que diferenciar. – sbi

+0

Véase también [esta respuesta] (http://stackoverflow.com/questions/2843916/c-help-about-class-and-error-c3861/2843960#2843960). – sbi

-1

(*a).b es lo mismo que a->b

2

Si la ambigüedad proviene de la capacidad de anular los dos operadores. El mejor ejemplo es shared pointers. Un puntero compartido se puede usar con. y -> operadores y ambos tienen diferentes significados.

Con -> se accede al objeto al que se apunta y con. accede a los miembros del puntero compartido en sí.

Por ejemplo:

class MyObject { 
public: 
    void myFunction() {} 
}; 
boost::shared_ptr<MyObject> ptr; 
ptr.use_count(); // calls use_count, which is a member of boost::shared_ptr. 
ptr->myFunction(); // calls MyObject::myFunction, as the operator-> is overriden 
-1

Tanto fo->bar y (*fo).bar hacer lo mismo!

El lenguaje simplemente proporciona un operador para el acceso indirecto, es decir, la flecha (->) y lo trata como un símbolo único.

+0

¿Por qué se ha votado? No responde la pregunta. –

+0

@Good ¡En realidad, editó su pregunta! – Secko

-1

El operador -> es simplemente una manera más fácil de referenciar el método o miembro de un objeto por su puntero, en lugar de usar algo como (* p) .member o (* p) .method.

Ejemplo:

MyClass * MyObj;

MyObj-> method(); es mejor leer y comprender que (* MyObj) .method();

0

C++ le permite superar al operador ->. Cuando tiene una clase de puntero inteligente como std::auto_ptr, la misma variable puede admitir . y ->, en la que utiliza . para acceder a los miembros de auto_ptr y -> para acceder a los miembros del puntero que contiene.

Cuestiones relacionadas