Почему этот конструктор, объявленный с двумя параметрами, может быть вызван только с одним? - PullRequest
2 голосов
/ 16 мая 2011

Я смотрел видео своего лектора из моего университета, и он говорит о классе Rational, что его конструктор выглядит так:

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

До сих пор все в порядке, НО !! он также сказал, что вы можете вызывать конструктор только с 1 аргументом (верхний аргумент), и потому что этот аргумент bottom инициализирует значение 1 рациональным, например: Rational(3) будет 3/1 .

НО !! Интересно, как мы можем использовать конструктор с 1 значением, только если он поддерживает ТОЛЬКО 2 аргумента?

Я знаю, что в java , если у нас есть x номер аргумента, который получает конструктор (не считайте другого конструктора и x> 0), мы должны передать их все не 1 вместо 2 ...

Пожалуйста, помогите мне разрешить этот конфликт ...

Thnx ...

Ответы [ 4 ]

10 голосов
/ 16 мая 2011

= в объявлении конструктора дает параметры значения по умолчанию . Если вы сами не предоставите значение при вызове конструктора, компилятор заменит для вас объявленное значение по умолчанию. Конструктор не будет знать разницу - он увидит оба параметра и не сможет определить, предоставил ли вызывающий объект оба значения или компилятор заполнил некоторые из них, но обычно это нормально. (Если вам нужно узнать разницу, объявите несколько конструкторов, каждый из которых имеет определенное количество параметров и не имеет значений по умолчанию.)

Ваш конструктор может быть вызван даже с параметрами no , так как они оба имеют значения по умолчанию. В этом случае первый параметр будет иметь значение по умолчанию 0, а второй - 1.

Значения параметров могут быть пропущены только с конца. То есть вы не можете опустить параметр top, не пропуская параметр bottom. Первый фактический параметр, который вы дадите, всегда будет соответствовать первому формальному параметру в объявлении. Аналогично, параметры по умолчанию могут быть определены только начиная с конца. Вы не можете определить параметр по умолчанию для top, не объявив также параметр для bottom.

2 голосов
/ 16 мая 2011

Чтобы расширить ответ Роба Кеннеди, вот несколько примеров того, что работает, а что нет:

Представьте себе класс Foo:

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

И рассмотрим следующие вызовы конструктора:

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.

Помните, что переменные по-прежнему передаются слева направо. Под этим я подразумеваю, что вы не можете пропустить любой аргумент, который предшествует аргументу, который вы хотите явно передать. Под этим я подразумеваю, что в приведенном выше примере вы не можете передать значение для b, но не указывать значение для a.

2 голосов
/ 16 мая 2011

Когда вы делаете это:

Rational r(42);

... значение по умолчанию 1 передается параметру bottom, поскольку ваш конструктор имеет значения по умолчанию для параметра bottom. (Вот что значит =1)

Если бы вы изменили объявление th-конструктора, чтобы оно не включало никаких значений по умолчанию:

Rational(int top, int bottom)

... тогда вы больше не сможете создавать объект Rational без явного указания обоих параметров.

0 голосов
/ 16 мая 2011

top и bottom - аргументы с неявными значениями.Это означает, что вы можете пропустить их при вызове функции, и их неявные значения будут использоваться для вызова функции.

Таким образом, с данным конструктором вы можете сказать Rational r; и r будет иметь верхние 0 и нижние 1, илиRational r(42), в верхнем случае будет 42 и нижняя 1, или Rational r(1,2); и верхняя 1 и нижняя 2.

...