关于c ++:具有默认值的构造函数&

Constructor with default values & Different Constructors

我想做这样的事

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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号车来了。问题:这两个构造器有什么区别:

1
2
3
4
5
6
7
class foo{
private:
    int a;

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

1
2
3
4
5
6
7
class foo{
private:
    int a;

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


在C++中,EDCOX1×1指针是一个EDCOX1,2,而不是EDCOX1×3(在Java中,您将使用EDCOX1 4)来访问它。也就是说,您需要一个取消引用的箭头(即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=)。


1
2
foo first(a=1);
foo first(b=2);

在C++中你不能真的拥有这个。它曾经被认为是标准化的,但后来却被放弃了。参数尽可能地近似命名参数,请参见http://www.boost.org/doc/libs/1_47_0/libs/parameter/doc/html/index.html

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

第一个构造函数正在初始化,而第二个构造函数正在分配给它。对于这个特殊的情况(int),没有什么区别。


对于您的示例来说,它可能是多余的,但您可能希望了解命名参数习惯用法。


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

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

是不合法的。您还有多个非唯一的Idenfier(例如first)。