用作函数参数时,将默认值设置为C数组

时间:2017-12-21 14:09:45

标签: c++ arrays default

我有以下功能:

void getDefaultMaterial(Uint8 rgb[3]);

问题是我希望rgb参数具有默认值。像那样:

void getDefaultMaterial(Uint8 rgb[3]={255, 255, 255});

不幸的是,编译器不喜欢这个?还有另一种方式吗?

4 个答案:

答案 0 :(得分:7)

请注意,参数是指针,而不是数组 对于编译器,原型等同​​于

void getDefaultMaterial(Uint8* rgb);

重载是另一种选择:

void getDefaultMaterial(Uint8 rgb[3]);

void getDefaultMaterial()
{
    Uint8 rgb[3] = { 255, 255, 255 };
    getDefaultMaterial(rgb);
}

但是,如果rgb是" out"参数,这一点让我望而却步。

如果它不是" out"参数,您可以使用具有默认值的实际数组,但您需要通过const引用传递它:

void getDefaultMaterial(const Uint8 (&rgb)[3] = {255, 255, 255});

或作为" out"带&#34的参数;默认为重载":

void getDefaultMaterial(Uint8 (&rgb)[3]);

void getDefaultMaterial()
{
    Uint8 rgb[3] = { 255, 255, 255 };
    getDefaultMaterial(rgb);
}

答案 1 :(得分:3)

或者使用std::array包装器作为参数:

void getDefaultMaterial(std::array<Uint8, 3> rgb = { { 255, 255, 255 } });

这将允许您使用braced-init-list作为默认参数值。请注意,仅C ++ 11标准需要 double 大括号。在C ++ 14及更高版本的标准中,您可以省略它们:

void getDefaultMaterial(std::array<Uint8, 3> rgb = { 255, 255, 255 });

答案 2 :(得分:2)

您可能不需要数组,因为它会衰减到函数参数中的指针。您可以简单地将其声明为指针并将其默认设置为nullptr或您喜欢的任何内容,并在函数中标识默认地址。

例如:

void getDefaultMaterial(Uint8 *rgb = nullptr) {
    static Uint8 defaultArg[3] = {255, 255, 255};
    if (rgb == nullptr) {
        rgb = defaultArg;
        // Reset them if you need
    }
    // Your stuff
}

答案 3 :(得分:2)

您所讨论的“数组”是指针,而不是数组。使用实际数组(只能通过引用传递)可以正常工作。

void fun (const int (&a)[3] = {1,2,3}) {
    std::cout << a[1];
}

当然,实际的正确方法是使用std::array,它没有所有这些限制。