为什么这个用两个参数声明的构造函数只能用一个参数调用



我在大学里看了讲师的视频,他谈到 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的值。

topbottom是具有隐式值的参数。这意味着您可以在调用函数时跳过它们,它们的隐式值将用于调用函数。

因此,使用给定的构造函数,您可以说 Rational r; 和 r 将具有顶部 0 和底部 1,或 Rational r(42) ,在女巫情况下,顶部将是 42 和底部 1,或者 Rational r(1,2); 和顶部是 1 和底部 2。

相关内容

  • 没有找到相关文章

最新更新