带有1个参数的C++ 2D数组索引(为什么这样做?)

Sha*_*tes 2 c++ class operator-overloading multidimensional-array

所以我一直在()为一个2d数组类重载一个运算符.对于我正在进行的随机测试,返回设置为array[0][index].现在只传递索引(行),列设置为0.如果索引小于行(那么我们在下一行)它仍然返回数据,就像我指定了列一样?

基本代码示例:

class myArr
{
private:
    float array[3][3];
public:
    myArr::myArr(float a1, float a2, ... ) { array[0][0] = a1; array[0][1] = a2; ... }
    // ^ the "..." just means, the same action till float a9/array[2][2] = a9;
    float& operator() (unsigned index) { return array[0][index]; }
    const float operator() (unsigned index) const { return array[0][index]; }
};

int main()
{
    myArr test(1, 2, 3, 4, 5, 6, 7, 8, 9);
    std::cout << myArr(4) << std::endl; // Displays 5
    myArr(4) = 0; // Set's element 4 to hold value 0
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

奇怪的是这有效.我可以使用1个参数设置/获取第5个元素.现在我想知道为什么/如何确切地工作,当然它应该错误地与"出界"或其他东西.最后这会是"安全的"还是你强烈建议不这样做?

我很少使用2D数组,主要是因为它们缺乏性能.

jia*_*103 6

数组连续存储在存储器中.在C++中,多维数组在内存中逐行存储,因此我相信它是一个完全有效的内存,可以超出当前行到下一行.如果超出2D数组的最后一行,则会出现超出范围.

这是否是一件好事,是一个不同的问题.显然,以这种方式编写代码会导致读者试图弄清楚你正在做什么,所以你想避免以这种方式编写真正的代码.

如果您要声明一个2D数组,那么您希望在数组的整个生命周期中保留这些语义,因此我强烈建议不要这样做.