Puntero de eliminar operador ( (*) vs -> )

Hay una diferencia general entre hacer

(*ptr).method()

vs

ptr->method()

Vi esta pregunta en un comentario en otra pregunta y pensé que iba a preguntar aquí. Aunque me acabo de acordar de que casi todos los operadores en C++ puede ser sobrecargado, por lo que supongo que la respuesta depende de la voluntad. Pero en general, hay una diferencia entre hacer uno contra el otro?

InformationsquelleAutor Falmarri | 2010-11-24

8 Kommentare

  1. 61

    Como «jamesdlin» ya se señaló, la * y -> de los operadores sobrecargados para la clase de tipos.

    Y, a continuación, las dos expresiones (*ptr).method() y ptr->method() puede tener un efecto diferente.

    Sin embargo, para el integrado en los operadores de las dos expresiones son equivalentes.

    La -> operador es más conveniente cuando se está siguiendo una cadena de punteros, porque . tiene mayor prioridad que *, por lo que requiere una gran cantidad de ungrokkable paréntesis.

    Considerar:

    pBook->author->snailMail->zip

    frente a

    (*(*(*pBook).author).snailMail).zip
  2. 12

    Para raw tipos de puntero, que son el equivalente.

    Y sí, para los tipos generales, la respuesta es, de hecho, «depende», como clases podría sobrecargar operator* y operator-> a tener comportamientos diferentes.

    • si una clase que, por supuesto, que usted está autorizado para perforar el autor en la cara… Duro.
  3. 8

    Estándar De C++ 5.2.5/3:

    Si E1 es de tipo «puntero a la clase
    X», entonces la expresión E1->E2 es
    convertido a la forma equivalente
    (*(E1)).E2;

    Para los no-valores de puntero a los operadores podrían sobrecargarse.

  4. 5

    Pero en general, hay una diferencia entre hacer uno contra el otro?

    ¡No! (a menos que -> y * son explícitamente sobrecargado para realizar diferentes funciones)

    ptr->method() y (*ptr).method() son equivalentes.

    • estos operadores pueden ser sobrecargados para las clases, y, a continuación, las dos expresiones pueden tener un efecto diferente. El «¡No!» es correcto para los operadores integrados. Saludos,
    • Añadido el unless parte. 🙂
  5. 2

    Lo siento a excavar en este post, pero a pesar de las expresiones de la OP son equivalentes para los raw de los tipos de puntero, creo que hay al menos una diferencia importante a ser mencionado en C++, además de todo lo que ha dicho:

    De La Wikipedia (http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B#cite_note-arrowptr-6):

    El tipo de retorno de operador->() debe ser del tipo para el cual el ->
    la operación puede ser aplicado, como un tipo de puntero. Si x es de tipo C
    donde C sobrecargue el operador->(), x->y obtiene expandida a
    x.operador->()->y.

    Esto implica que -> se espera que devuelva un dereferenceable tipo, mientras que * se espera que devuelva un eliminan las referencias tipo, y por lo tanto esta «cadena» se aplica a -> sólo.

    • No veo tu punto? Los diferentes tipos de retorno son un básico de la verdad inherente en la sintaxis o a la colocación de los dos operadores. Como Alf ha demostrado, esto no impide que usted ser capaz de hacer exactamente las mismas cosas con *(ptr) si puede ser molestado en escribir suficiente asteriscos y los paréntesis. (Conceptual operador, -> es un regalo; yo sólo deseo que no utilizan dos caracteres.)
    • Mi punto es que su puesta en práctica (y uso) son un poco pero es importante destacar que diferentes; en particular, no podría ser más intuitiva que -> debe devolver un «puntero» y no una «referencia», y esta pequeña diferencia es la razón fundamental por la que uno puede estar encadenado con facilidad y no el otro (encadenamiento sólo puede ocurrir si la entrada y la salida se comportan de la misma manera). Algunas personas (como usted parece) prefieren explicaciones fácticas en términos de uso práctico diferencia, yo prefiero razones fundamentales (de la que puedo derivar fáctica diferencias mí mismo).
    • Yo sorta ver lo que quieres decir, pero tal vez de manera diferente intuitiva para diferentes personas: dado que -> reemplaza a un operador que se originó en los punteros, yo sólo esperaba que trabajar en un puntero (no de referencia) tipo de objeto, y para mí que‘s de la fundamental. Pero estoy seguro de que he sido confundido por las cosas más simples, así que cualquier ayuda a cada persona a entender que está todo bien.
    • Respetuosamente creo que se podría haber perdido mi punto de nuevo; no se trata de lo que funciona en, sino más bien acerca de lo que devuelve lo que se aplicó. Por supuesto, sería de esperar -> y * para trabajar en punteros debido a que es cómo funciona en C. Pero la parte importante es que -> se espera que devuelva un tipo que es dereference_able_ (es decir, que se comporta de la misma como lo -> se aplicó en el primer lugar), mientras que * se espera que devuelva un dereferenc_ed_ tipo (que rompe el encadenamiento, y es por eso que usted necesita usar .<something> antes de usar * de nuevo).
    • Todo lo que puedo decir es que para mí, esta diferencia es obvia de cómo estos operadores se utilizan en condiciones normales de tipos y especificaciones d por tipos personalizados. Pero eso es sólo conmigo; si su forma de explicar esto ayuda a que usted o alguien más lo entiendo muy bien.
  6. 1

    La -> secuencia sirve como un indicador visual de que está apuntando a algo. Tanto a los operadores a hacer exactamente la misma secuencia de operaciones.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea