array是分配在栈上的数组。
array的size一定是在编译的时候就可以确定好的,因此也是一个可以获得的常数。
array可以通过下标访问元素或修改元素(常量情况下可以访问元素)。
array可以得到数组首地址。
#include <iostream>
#include <assert.h>
#include <string.h>
template<typename T, size_t S>
class Array
{
public:
// 数组的长度应该是固定的,也就是编译时候可以确定的量,因此需要加上常量表示
constexpr int Size() const {return S; }
// 通过数组下标访问,需要重载[],
// 另外普通数组是可以通过index来修改对应元素的,并且减少copy,因此返回值需要是引用
// 还有一点注意的是传入的类型是size_t,他是一个无符号数,大小与平台有关。
// 如果要判断索引是否越界,使用无符号数与一个判断条件即可(负数会变为很大的正数)。
T& operator[](size_t index)
{
if (!(index < S))
{
// report error
std::cout << "index: " << index << std::endl;
}
// assert(index < S);
return m_Data[index];
}
// 对于常量数组,我们应该可以访问他但不能改变他,因此需要多一个重载
const T& operator[](size_t index) const {return m_Data[index]; }
// 访问数组首地址的方法
T* Data() {return m_Data; }
const T* Data() const {return m_Data; }
private:
T m_Data[S];
};
int main()
{
int size = 5;
Array<int, 5> data;
// 一个初始化的好方法:
memset(data.Data(), 0, data.Size()*sizeof(int));
for (int i = 0; i < data.Size(); i++){
std::cout << data[i] << " ";
}
std::cout << std::endl;
std::cout << data[-1] << std::endl;
}