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

时间:2014-10-27 19:43:02

标签: c++ class operator-overloading multidimensional-array

所以我一直在为一个2d数组类重载一个运算符()。对于我正在进行的随机测试,return设置为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;
}

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

我很少使用2D数组,主要是因为它们没有获得性能提升。

2 个答案:

答案 0 :(得分:6)

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

这是否是一件好事,是一个不同的问题。很明显,以这种方式编写代码会导致读者摸不着头脑,试图弄清楚你在做什么,所以你要避免以这种方式编写实际代码。

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

答案 1 :(得分:0)

分配2d数组时,其内存是连续的。因此,如果您分配一个3 * 3的浮点数组,您将分配9 * 4个连续字节。 这导致:

&array[0][i] = array + 0*3 + i = array + i = array[i]

所以&#34;偶然&#34;,你得到了正确的结果。