当前位置: 首页 > news >正文

深入解析:C++11----列表初始化和initializer_list

这里注意,这个与构造函数的初始化列表没有任何关系。首先我们先看C++98中列表,{}的使用场景:允许数组使用列表赋值

int a[] = {1,2,3,4};
int b[5] = {0};

列表初始化

但是对于vector这样的自定义类型就无法这样赋值,而是需要循环遍历赋值。所以C++11就引入了列表初始化:

int main()
{// 内置类型变量int x1 = {10};int x2{10};int x3 = 1+2;int x4 = {1+2};int x5{1+2};// 数组int a[5] {1,2,3,4,5};int b[]{1,2,3,4,5};// 动态数组,在C++98中不支持int* p1 = new int[5]{1,2,3,4,5};// 标准容器vector v{1,2,3,4,5};map m{{1,1}, {2,2,},{3,3},{4,4}};return 0;
}

自定义类如何支持列表初始化

对于自定义类型:也是支持用列表进行初始化的,但是须要有对应参数类型和个数的构造函数,因为用{}初始化,会调用对应的构造函数

class A
{
public:A(int x = 0, int y = 0): _x(x), _y(y){}
private:int _x;int _y;
};
int main()
{A a{1,2};return 0;
}

我们要说一说,他是怎么支持stl中容器的初始化的,很显然,vector中只有capacity,size,还有一个指针,但是无论多长的列表都可以使用{}进行初始化。所以不满足上述红字的要求,那么C++11是如何支持的呢?这就要说到initializer_list,他是C++中的一个类

initializer_list

对象想要支持列表初始化,需给该类(模板类)添加一个带有initializer_list类型参数的构造函数即
可。注意:initializer_list是系统自定义的类模板,该类模板中主要有三个方法:begin()、end()迭代器以及获取区间中元素个数的方法size()。

我们来看一看这个类:

可以看到sizeof它,仅仅只有8个字节,但是给了它3个int啊,这是因为它的内部只有两个指针。你不能手动往 initializer_list 里添加或修改值,它是一个轻量的、只读的容器视图(view)。唯一能让它包含元素的方式就是用 {} 初始化(调用构造函数)。

接下来说一说,形如vector这样的自定义类是如何支持{}初始化的

其实就是调用对应的构造函数。

构造函数类似:

vector(initializer_list lt):_start(nullptr),_finish(nullptr),_endofstorage(nullptr)
{typename initializer_list::iterator it = lt.begin();auto it = it.begin();while(it != lt.end()){push_back(*it);++it;}
}

这种初始化是调用了一个initializer_list作为参数的构造函数来初始化:vector<int> v1 = {1,2,3,4,5};
所以,自定义类型对象可以使用{}初始化,必须要有对应参数类型和个数的构造函数,因为用{}初始化,会调用对应的构造函数。如果不是这种自定义类型,而是类似STL容器,如果要支持{}初始化,那么里面必须有支持一个initializer_list作为参数的构造函数

http://www.jsqmd.com/news/43539/

相关文章:

  • 哥德尔不完备定理,就是哥德尔不完蛋定理,鸡生蛋,蛋生鸡,生生不息
  • macOS 搜文件太慢?试试「HiTooler File Finder」,速度媲美 Windows Everything - 教程
  • 美国本科如何规划求职?2025全攻略+靠谱中介机构推荐
  • linux 8080 打开
  • linux 64位编译32位
  • 植物大战僵尸杂交版3.9.9下载安装教程
  • 实用指南:DevOps 生命周期完全指南
  • 算法第三章实践作业
  • 2025年比较好的茶叶烘干网带行业内口碑厂家排行榜
  • 2025年靠谱的自动化设备工业铝型材行业内口碑厂家排行榜
  • 2025年美国求职中介哪家强?名企内推/简历精修/职场规划,高性价比机构推荐
  • 2025年热门的保健托玛琳床垫厂家选购指南与推荐
  • 2025美国科研中介实力榜,高性价比名校科研机构TOP5
  • 2025年美国付费实习中介哪家靠谱,名企内推/背景提升/求职规划/全程护航机构推荐
  • 【日记】什么时候我能开写轮眼(1288 字)
  • 基于单片机的液体流量检测设计 (仿真+电路+代码)(51+1602+YFS201+BZ+KEY2) 0464
  • 2025 CSP-S2 游记 -
  • 2025年知名的防静电劳保鞋厂家最新推荐排行榜
  • 2025年评价高的常熟劳务派遣权威榜单
  • 2025年评价高的青年鸡畅销推荐
  • linux 64 编译 32
  • 2025年比较好的白水苹果高品质供应榜
  • 2025年正规的企业短视频账号代运营TOP品牌榜
  • 2025年口碑好的内衣贴牌厂家推荐及选择建议
  • Universal 4-Button Smart Remote Start Key for Honda – KD ZB10-4 (5pcs/lot)
  • 2025年比较好的定制豪华骑马抽最新TOP排名厂家
  • 2025年11月江苏门窗隔热条品牌权威排名榜单:若克斯新材料领跑行业
  • 2025年热门的全屋定制门墙柜厂家最新推荐榜
  • 2025年评价高的谷歌优化客户满意度榜
  • 2025年评价高的物流口碑最佳榜