2011-08-23 16 views
9

Mi profesor de C++ piensa que el operador * en C++ estándar está "ya sobrecargado", ya que puede significar indirección o multiplicación según el contexto. Se puso esto desde C++ Primer Plus, que establece:¿El operador C++ * "ya está sobrecargado"?

En realidad, muchos de C++ (y C) los operadores ya están sobrecargados. Por ejemplo, el operador *, cuando se aplica a una dirección, arroja el valor almacenado en esa dirección. Pero aplicar * a dos números produce el producto de los valores. C++ usa la cantidad y el tipo de operandos para decidir qué acción tomar. (pg 502, 5ª ed)

Al menos otro libro de texto dice lo mismo. Hasta donde puedo decir, esto no es verdad; unario * es un operador diferente de binario *, y el mecanismo por el cual el compilador los desambigua no tiene nada que ver con la sobrecarga del operador.

¿Quién tiene razón?

+3

Tienes razón. En cierto sentido, es justo decir que los operadores integrados ya actúan polimórficamente dependiendo de sus argumentos. Eso es polimorfismo estático – sehe

+7

Tenga en cuenta que además de que hay dos operadores '*' (que es "sobrecarga" en el sentido inglés pero no en el sentido C++), el binario incorporado '*' en realidad también está sobrecargado en el sentido C++, en que se aplica a diferentes tipos - 'int',' double', etc. con diferentes efectos. El conjunto de sobrecargas efectivas para la resolución de sobrecarga del operador se define en la norma, en 13.6/12.Del mismo modo, unario '*' está efectivamente sobrecargado para cada tipo de puntero (13.6/6) y tipo de puntero a función (/ 7). –

Respuesta

12

Ambos tienen razón, ya que la pregunta depende del contexto y del significado de la palabra sobrecarga.

"Sobrecarga" puede tener un significado común de "mismo símbolo, significado diferente" y permitir todos los usos de "*", incluyendo la indirección y la multiplicación, y cualquier comportamiento definido por el usuario.

La "sobrecarga" se puede utilizar para aplicar a la funcionalidad de sobrecarga del operador oficial de C++, en cuyo caso la indirección y la multiplicación son realmente diferentes.

ADENDA: Véase el comentario de Steve continuación, el "operador" overoading versues " token de sobrecarga".

+15

De modo que incluso el término "sobrecarga" está sobrecargado. –

+7

Para ser precisos, creo que con el primer significado es que el token '*' está sobrecargado, no el operador '*'. Es un cabello muy fino para dividir, sin embargo, digo que es el token solo porque la gramática de una expresión que usa '' 'unario es diferente de la gramática de una expresión que usa' '' binario. Puedes imaginar que ambos se convierten en 'operator * (...)', con un argumento para unary y dos para binary, en cuyo caso se comporta como una sola función sobrecargada llamada 'operator *'. Simplemente no es así como sucede el estándar para definir expresiones aritméticas. –

+1

@Steve Estoy totalmente de acuerdo y me gusta esa precisión. Yo tomaría esa respuesta sobre la mía. :) –

2

Creo que eres. La desreferencia op y la mult. op son diferentes operadores, incluso si están escritos de la misma manera. lo mismo vale para +, -, ++, - y cualquier otro que haya olvidado.

Creo que el libro, en este párrafo, se refiere a la palabra "sobrecargado" como "utilizada en más de 1 vía", pero no por el usuario. Por lo tanto, también podría considerar que el libro es correcto ... también depende si se refiere a la sobrecarga del operador * o del operador de multiplicación (por ejemplo).

1

Está sobrecargado en el sentido de que el mismo carácter se usa para significar cosas diferentes en diferentes lugares (por ejemplo, desreferencia del puntero, multiplicación entre int s, multiplicación por otros tipos incorporados, etc.).

general, sin embargo, "la sobrecarga de operadores" se refiere a la definición de un operador (que tiene el mismo símbolo como una función de uno) utilizando el código personalizada para que haga algo interesante con un tipo definido por el usuario .

Entonces ... ambos tienen razón :-)

Cuestiones relacionadas