【问题标题】:Why can this constructor declared with two parameters be called with just one?为什么用两个参数声明的构造函数只能用一个来调用?
【发布时间】:2011-05-16 19:38:09
【问题描述】:

我观看了我大学讲师的视频,他谈到了 Rational 类,它的构造函数是这样的:

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

到目前为止,一切都很好,但是!他还说您只能使用 1 个参数(顶部参数)调用构造函数,因为底部初始化为 1 的值,例如:Rational(3) 将是 3/1

但是!!我想知道只有当它仅支持 2 个参数时,我们如何才能使用具有 1 个值的构造函数?

我知道在 java 中,如果我们有 x 个构造函数接收的参数(考虑没有其他构造函数和 x>0),我们必须将它们全部传输,而不是 1 而不是 2...

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

谢谢...

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      当你这样做时:

      Rational r(42);
      

      ...1 的默认值提供给参数bottom,因为您的构造函数具有bottom 参数的默认值。 (这就是=1的意思)

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

      Rational(int top, int bottom)
      

      ...如果不明确指定两个参数,您将无法再构造Rational 对象。

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

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

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

          【讨论】:

            猜你喜欢
            • 2019-11-05
            • 2012-07-28
            • 2013-12-11
            • 1970-01-01
            • 2020-06-26
            • 1970-01-01
            • 1970-01-01
            • 2013-07-06
            相关资源
            最近更新 更多