构造函数,默认值为&不同的构造者

时间:2011-09-14 01:12:10

标签: c++ constructor

我想做这样的事情

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);
}

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

这是2.问题:这两个构造函数有什么不同:

class foo{
private:
    int a;

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

class foo{
private:
    int a;

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

4 个答案:

答案 0 :(得分: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),没有太大区别。

答案 1 :(得分:1)

在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 :(得分:0)

C ++不支持命名参数,所以:

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

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

答案 3 :(得分:0)

您的示例可能有些过分,但您可能想了解Named Parameter Idiom