我想做这样的事情
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}
}
答案 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。