参考

  • c++11标准特性
  • IDE:vs 2022

定义

  • 定义时必须指定大小,且不能使用变量指定
  • 可以通过arry构造新的array,{}也合法
  • 不可以使用数组构造,即arry = ch是不合法的操作
  • 本质上任然是一个固定大小的数组,不能删除或者添加元素。

注意

如果使用了using namespace std,则后续代码可以无视std::
前期先保持基础写法。


前言

在c语言和c++中,传统方式上定义一个数组可以用:

1
2
int ch[10] = {0};
int *ch2 = new int[10];

两者区别不大,前者由系统自动分配到栈区,后者在堆区上开辟空间并用指针指向它。


正文

使用array前,需引用头文件;

1
2
3
std::array<int, 2> ary = { 0,1 };
//或者不用=也一样
std::array<int, 2> ary2 { 0,1 };

size()

array内置size()方法,可以直接返回array数组有几个成员。

传统上我们需要知道数组的成员个数需要通过sizeof(数组)/sizeof(数组类型或者数组首成员[0])


fill()

可以说是一个初始化方法,根据括号内的值,将array数组所有成员都设置为括号内的值。
当然跟传统上的方法感觉差别不大。


at()

具有传统意义上索引作用,传统数组使用数组[0]来获取内容,而array数组则根据at(0)来返回,当然不是说arry数组就不能使用[]了,而是多了at()方法。

如果产生越界行为,如arry<int,2> arr,而你去访问arr.at(100),程序即产生错误抛出异常:

传统定义的数组去访问越界时就有可能得到不正确的值,可以说是一种不安全的行为:


==重载

可以看到有意思的是,arrary数组相比较能返回真,而相同的int数组则返回假,当然底层离不开符号重载的实现。重载后面再说,我们可以浅看一下反汇编代码:
先打个断点:
然后转到反汇编:

首先就是array的反汇编代码比正常数组的代码少。
然后ch和ch1有一个cmp比较过程,但随后的jne好像是不等于就转移,然后后面就是一堆跟地址一样的操作

汇编还没系统性学习,看个大概

ary和ary2在call的时候有一个operator==,这是符号重载的写法,也就是说这里肯定离不开重载,至于后面的目前也不是很清楚


结语

内置的方法还有几个,涉及到容器的方面,等后面再补充吧。

封装好的东西固然功能多,在各方面会更完善,但也就意味着资源消耗的也多了。不过使用的前提还是看使用者,有这么个好东西知道就行。