将参数初始化为构造函数,而不是第一个

时间:2019-06-23 13:09:20

标签: c++ constructor

在以下情况下,我想显式更改结构的构造函数中的第二个参数。如果可以,怎么可能?

struct foo{
    int x;
    int y;
    foo(int a=4, int b=6){
        x=a;
        y=b;
    }
};

int main(){
    foo *f = new foo();
    cout<<f->x<<" "<<f->y<<endl;
   //4 6 
    foo *g = new foo(3,4);
    cout<<g->x<<" "<<g->y<<endl;
    //3 4
    foo *h = new foo(3);
    cout<<h->x<<" "<<h->y<<endl;
   //3 6
   //Can something like this be 
   //done in C++, if I want
   //to change the value of the 
   //second variable only
    foo *k = new foo(b = 13);

return 0;

}

1 个答案:

答案 0 :(得分:3)

  

有可能吗?

构造函数是不可能的。通常,c ++不支持函数的命名关键字参数,并且如果要在其后传递非默认值,即使具有默认值也无法跳过参数。

如果使用默认成员初始化程序,则自C ++ 20使用指定的初始化程序起,就可能无需构造函数使用列表初始化语法:

struct foo{
    int x = 4;
    int y = 6;
};

int main(){
    foo f {.y = 4};
}

您可以通过标签分配实现类似的功能;无需将来的标准:

struct foo{
    int x = 4;
    int y = 6;

    enum Xtag { Xinit };
    enum Ytag { Yinit };

    foo(int a, int b) : x(a), y(b) {}
    foo(Xtag, int a)  : x(a) {}
    foo(Ytag, int b)  : y(b) {}
};

int main(){
    foo f(foo::Yinit, 4);
}

使用lambda的解决方案,无需修改现有类即可使用。以下符合您对foo的定义:

auto make_foo_x4 = [](int b) {
    return foo(4, b);
};
foo f = make_foo_y(4);

缺点是我们必须显式地重复默认值x,因此,如果在类定义中更改了默认值,这可能会破坏假设。