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

时间:2011-05-16 19:38:10

标签: c++ class operator-overloading rational-number

我在大学里观看了我的讲师视频,并且他讲了关于Rational类的构造函数是这样的:

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

直到现在一切都还好,但是!!他还说你只能使用1个参数(top参数)来调用构造函数,并且因为底部初始化为1,所以理性例如:Rational(3) 3/1 。< / p>

但是!!我想知道如果只支持2个参数,我们怎么能使用带有1值的构造函数?

我知道在 java 中如果我们有构造函数接收的x个参数(不考虑其他构造函数和x&gt; 0),我们必须将它们全部转移为1而不是2 ... < / p>

请帮我解决这个冲突......

...日Thnx

4 个答案:

答案 0 :(得分:10)

构造函数声明中的=给出参数默认值。如果在调用构造函数时没有自己提供值,编译器将为您填写声明的默认值。构造函数不会知道区别 - 它将看到两个参数,并且它无法检测调用者是否提供了这两个值,或者编译器是否填充了其中的一些,但这通常是正常的。 (如果你需要知道差异,那么声明多个构造函数,每个构造函数都有不同数量的参数,并且没有默认值。)

甚至可以使用 no 参数调用构造函数,因为它们都具有默认值。在这种情况下,第一个参数的默认值为0,第二个参数的值为1.

参数值只能从末尾省略。也就是说,如果不遗漏top参数,则无法省略bottom参数。您提供的第一个实际参数将始终对应于声明中的第一个形式参数。同样,默认参数只能从结尾开始定义。如果没有为top声明一个参数,则无法为bottom定义默认参数。

答案 1 :(得分:2)

执行此操作时:

Rational r(42);

... 1的默认值提供给参数bottom,因为您的构造函数具有bottom参数的默认值。 (那是=1即将发生的)

如果您要将构造函数的声明更改为不包含任何默认值:

Rational(int top, int bottom)

...然后,如果没有明确指定两个参数,您将无法构建Rational对象。

答案 2 :(得分:2)

为了扩展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省略一个值。

答案 3 :(得分:0)

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

因此,对于给定的构造函数,您可以说Rational r;并且r将具有顶部0和底部1,或Rational r(42),如果顶部将是42和底部1,或Rational r(1,2);并且顶部是1和底部2。