【问题标题】:C++ function, what default value can I give for an object?C++ 函数,我可以为对象提供什么默认值?
【发布时间】:2012-04-12 03:49:32
【问题描述】:

我是 C++ 编程的新手,所以现在请不要太苛刻 :) 。以下示例说明了我的问题的最小描述。假设我在头文件中有这个函数声明:

int f(int x=0, MyClass a); // gives compiler error

编译器会抱怨,因为带有默认值的参数后面的参数也应该有默认值。

但是我可以给第二个参数什么默认值呢?

这个想法是,如果其余的参数与特定情况无关,则可以使用少于两个参数调用该函数,因此应执行以下所有操作:

MyClass myObj; // create myObj as an instance of the class MyClass
int result=f(3,myObj); // explicit values for both args

int result=f(3); // explicit for first, default for second arg

int result=f(); // defaults for both

【问题讨论】:

  • 可以把int f(int x=0, MyClass a);改成int f(MyClass a, int x=0);吗?
  • 人们不会对 SO 苛刻 :-),但 C++ 会。 ;-)。出于好奇:您为什么选择学习 C++?

标签: c++ function object default


【解决方案1】:

你能做的最好的就是

int f(MyClass a, int x=0);

在这种情况下,您可以使用一个参数 (MyClass) 和默认的第二个参数调用该函数,也可以使用两个显式参数 (MyClass, int)。

【讨论】:

    【解决方案2】:
    int f(int x=0, MyClass a = MyClass());
    

    【讨论】:

      【解决方案3】:

      我认为您可以执行以下任一操作:

      int f(MyClass a, int x=0); // reverse the order of the parameters
      int f(int a=0, MyClass a = MyClass()) // default constructor
      

      【讨论】:

        【解决方案4】:

        你可以做一个

        int f(int x=0, MyClass a = MyClass());
        

        并根据需要添加构造函数参数。

        【讨论】:

          【解决方案5】:

          您可能还想考虑提供重载而不是默认参数,但对于您的特定问题,因为 MyClass 类型有一个默认构造函数,如果它在您的设计中有意义,您可以默认为:

          int f(int x=0, MyClass a = MyClass() ); // Second argument default 
                                                  // is a default constructed object
          

          如果您愿意,您可以通过手动添加重载来获得更大的用户代码灵活性:

          int f( MyClass a ) {      // allow the user to provide only the second argument
             f( 0, a );
          }
          

          您还应该考虑在接口中使用引用(通过 const 引用获取 MyClass

          【讨论】:

            猜你喜欢
            • 2011-06-17
            • 1970-01-01
            • 2018-03-25
            • 2011-01-25
            • 1970-01-01
            • 1970-01-01
            • 2022-12-06
            • 2018-11-10
            • 1970-01-01
            相关资源
            最近更新 更多