【问题标题】:Constructor with default values & Different Constructors具有默认值的构造函数和不同的构造函数
【发布时间】:2011-09-14 01:12:10
【问题描述】:

我想做这样的事情

class foo{
private:
    double a,b;

public:
    foo(double a=1, double b=2){
        this.a=a;
        this.b=b;
    }
}

int main(){
    foo first(a=1);
    foo first(b=2);
}

这样的事情可能吗,还是我需要创建两个新的构造函数?

第二个问题来了:这两个构造函数有什么区别:

class foo{
private:
    int a;

public:
    foo(int in):a(in){}
}

class foo{
private:
    int a;

public:
    foo(int in){a=in}
}

【问题讨论】:

  • this.a 不是合法的 C++。

标签: c++ constructor


【解决方案1】:
foo first(a=1);
foo first(b=2);

你不能在 C++ 中真正拥有它。它曾经被考虑进行标准化,但后来放弃了。 Boost.Parameter 尽可能地逼近命名参数,请参阅 http://www.boost.org/doc/libs/1_47_0/libs/parameter/doc/html/index.html

foo(int in):a(in){}
foo(int in){a=in}

第一个构造函数初始化 a,而第二个构造函数赋值给它。对于这种特殊情况 (int),差别不大。

【讨论】:

    【解决方案2】:

    在 C++ 中,this 指针是 pointer 而不是 object(在 java 中,您可以使用 . 访问它)。也就是说,您需要一个取消引用箭头(即this->member(*this).member)。

    无论如何,这是可以做到的。但是,C++ 中的参数化以相反的顺序工作,无法命名。例如,int test(int a=2, int b=42)int test(int a, int b=42) 都是合法的。但是,int test(int a=2, b) 是不合法的。

    关于你的第二个问题,这个例子中的构造函数之间没有显着差异。有一些小的(潜在的)速度差异,但在这种情况下它们很可能可以忽略不计。在第一个中,您使用初始化列表(继承和调用基类的构造函数需要),第二个只是显式设置变量的值(即使用 operator=())。

    【讨论】:

    • 对于 (2) 值得注意的是,如果 a 的类型不是基本类型,则速度差异会更大。使用初始化列表可确保 a 被构造一次,而不是默认构造并稍后分配。对于复杂类型,这可能意味着避免调用newdelete
    【解决方案3】:

    对于您的示例来说,这可能有点矫枉过正,但您可能想了解Named Parameter Idiom

    【讨论】:

      【解决方案4】:

      C++ 不支持命名参数,因此:

      int main()
      { 
        foo first(a=1); 
        foo first(b=2); 
      } 
      

      不合法。您还有多个非唯一标识符(例如 first)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-05-19
        • 1970-01-01
        • 2016-03-24
        • 1970-01-01
        • 1970-01-01
        • 2017-09-27
        • 2023-03-20
        • 2020-05-14
        相关资源
        最近更新 更多