c++ - 数组形参的退化自动转换

    技术2022-05-19  20

    C++中根本不存在所谓的“数组形参”,因为数组在传入时,实质上只传入指向其首元素的指针:

    void average(int ary[12]);//形参是一个int *

    这种从数组到指针的自动转换被称之为“退化”。

     

    如果数组的边界的精确数值非常重要,常见的做法是明确传入其长度:

    void average_n(int ary[], int size);

     

    但是更进一步,如果希望函数只接受含有特定数量的元素的数组,可以考虑使用一个引用形参:

    void average(int (&ary)[12]);

     

    当然,我们可以用模板来泛化:

    template <int n>

    void average(int ary[n]);//编译器会帮我们推到n的值

     

    不过我们可以将这两种方式结合起来:

    template <int n>

    inline void average(int (&ary)[n])

    {average_n(ary, n);}

     

    更好的办法是,使用标准容器(vector等)来代替对数组的传统用法。

     

     


    最新回复(0)