¿Por qué se puede llamar a este constructor declarado con dos parámetros con solo uno?

Vi el video de mi profesor de mi universidad y dice sobre la clase Rational que su constructor dice así:

Rational (int top=0 , int bottom=1)
: t(top) , b(bottom) {normalize();}

Hasta ahora todo está bien, PERO !! también dijo que puede llamar al constructor solo con 1 argumento (argumento superior) y porque ese inferior se inicializa al valor de 1 el racional, por ejemplo: Rational(3) se mostrarán 3/1.

PERO !! Me pregunto cómo podemos usar un constructor con 1 valor solo si admite 2 argumentos SOLAMENTE.

Yo se que en Java si tenemos x número de argumentos que recibe el constructor (no considere otro constructor yx> 0) debemos transferirlos todos, no 1 en lugar de 2 ...

Ayúdame a resolver este conflicto ...

gracias ...

preguntado el 16 de mayo de 11 a las 19:05

4 Respuestas

La = en la declaración del constructor dar los parámetros valores predeterminados. Si no proporciona un valor usted mismo cuando llama al constructor, el compilador completará el valor predeterminado declarado por usted. El constructor no notará la diferencia: verá ambos parámetros y no tendrá forma de detectar si el llamador proporcionó ambos valores o si el compilador completó algunos de ellos, pero eso suele estar bien. (Si necesita conocer la diferencia, declare varios constructores, cada uno con un número distinto de parámetros y sin valores predeterminados).

Incluso se puede llamar a tu constructor con no parámetros porque ambos tienen valores predeterminados. En ese caso, el primer parámetro tendrá el valor predeterminado 0 y el segundo obtendrá 1.

Los valores de los parámetros solo se pueden omitir desde el final. Es decir, no puede omitir el top parámetro sin omitir también el bottom parámetro. El primer parámetro real que proporcione siempre corresponderá al primer parámetro formal en la declaración. Asimismo, los parámetros predeterminados solo se pueden definir comenzando por el final. No puede definir un parámetro predeterminado para top sin declarar también uno para bottom.

contestado el 16 de mayo de 11 a las 23:05

Cuando haces esto:

Rational r(42);

... el valor predeterminado de 1 se suministra al parámetro bottom, porque su constructor tiene valores predeterminados para el bottom parámetro. (Eso es lo que =1 es sobre)

Si tuviera que cambiar la declaración del constructor para que no incluya ningún valor predeterminado:

Rational(int top, int bottom)

... entonces ya no podrás construir un Rational objeto sin especificar ambos parámetros explícitamente.

contestado el 16 de mayo de 11 a las 23:05

Para ampliar la respuesta de Rob Kennedy, aquí hay algunos ejemplos de lo que funciona y lo que no:

Imagina una clase Foo:

class Foo
{
    Foo( int a = 0, float b = 1.0f );
}

Y considere las siguientes llamadas al constructor:

Foo foo_obj = Foo(5, 6.0f);    // Fine, two arguments are passed. a will be 5 and b will be 6.0f.

Foo foo_obj = Foo(5);          // Fine as well. a will be 5 and b will be 1.0f. This is because b has a default value in the constructor.

Foo foo_obj = Foo();           // Fine too, a will be 0 and b will be 1.0f. This is because both a and b have default values in the constructor.

Tenga en cuenta que las variables todavía se pasan de izquierda a derecha. Con esto quiero decir que no puede dejar de lado ningún argumento que venga antes del argumento que desea pasar explícitamente. Con esto quiero decir que en el ejemplo anterior, no puede pasar un valor para b, pero dejar fuera un valor para a.

contestado el 16 de mayo de 11 a las 23:05

top y bottom son argumentos con valores implícitos. Eso significa que puede omitirlos al llamar a la función y sus valores implícitos se usarán para llamar a la función.

Entonces, con el constructor dado, puedes decir Rational r; y r tendrá un 0 superior y un 1 inferior, o Rational r(42), en el caso de que la parte superior sea 42 y la inferior 1, o Rational r(1,2); y la parte superior es 1 y la parte inferior 2.

contestado el 16 de mayo de 11 a las 23:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.