我在大学里看了讲师的视频,他谈到 Rational 类时说它的构造函数是这样的:
Rational (int top=0 , int bottom=1)
: t(top) , b(bottom) {normalize();}
到目前为止一切都很好,但是!! 他还说,您只能使用 1 个参数(顶部参数)调用构造函数,并且因为底部初始化为值 1,因此有理数例如:Rational(3)
将是 3/1。
但!!我想知道我们怎么能只使用一个值为 1 的构造函数,如果它只支持 2 个参数?
我知道在 java 中,如果我们有构造函数接收的 x 个参数(不考虑其他构造函数和 x>0),我们必须将它们全部传输而不是 1 而不是 2...
请帮我解决这个冲突...
闷......
函数声明中的=
为参数提供默认值。如果在调用构造函数时未自己提供值,编译器将为您填写声明的默认值。构造函数不会知道差异 — 它将看到两个参数,并且它无法检测调用者是否提供了这两个值,或者编译器是否填写了其中一些值,但这通常没问题。 (如果您需要知道差异,则声明多个构造函数,每个构造函数都有不同数量的参数, 并且没有默认值。
甚至可以在没有参数的情况下调用构造函数,因为它们都有默认值。在这种情况下,第一个参数的默认值为 0,第二个参数的默认值为 1。
参数值只能从末尾省略。也就是说,不能省略top
参数而不省略bottom
参数。您给出的第一个实际参数将始终对应于声明中的第一个形式参数。同样,默认参数只能从末尾开始定义。如果不同时为 bottom
声明一个默认参数,则无法为 top
定义默认参数。
当你这样做时:
Rational r(42);
。默认值 1
将提供给参数 bottom
,因为构造函数具有 bottom
参数的默认值。 (这就是=1
的内容)
如果要更改构造函数的声明以不包含任何默认值:
Rational(int top, int bottom)
。这样,如果不显式指定这两个参数,您将无法再构造 Rational
对象。
为了扩展Rob Kennedy的答案,这里有一些有效和无效的例子:
想象一个班级 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的值。
top
和bottom
是具有隐式值的参数。这意味着您可以在调用函数时跳过它们,它们的隐式值将用于调用函数。
因此,使用给定的构造函数,您可以说 Rational r;
和 r 将具有顶部 0 和底部 1,或 Rational r(42)
,在女巫情况下,顶部将是 42 和底部 1,或者 Rational r(1,2);
和顶部是 1 和底部 2。