所以我一直在为一个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数组,主要是因为它们没有获得性能提升。
答案 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;,你得到了正确的结果。