网站首页 > 基础教程 正文
什么是初始化列表?
初始化列表用来初始化类的成员变量.
先看一下类的成员变量初始化的方法:
代码1执行后的结果:
类object的成员变量a在构造函数里进行了初始化。
使用初始化列表:
:a(4),b(5)即使初始化列表了,这个以:开始,逗号作为间隔的列表,就是初始化列表。
我们运行加了初始化列表的代码,结果:
结果发现,a依然为2,b依然为3。
好像初始化列表没有发生作用一样。
如果我们将代码改为这样:
运行如下:
发现:a(4),b(5)成功把成员变量a,b初始化了。
综合代码2,代码3:初始化列表运行结束后,构造函数语句才运行,所以,当构造函数内有对a,b赋值时,就会覆盖掉初始化列表中的值了。
初始化列表在C++中存在的必要性
代码3在初始化列表内可以实现类成员变量a,b的初始化.
代码1在构造函数体可以实现成员变量a,b的初始化,还比较灵活。可以在写代码的时候,再根据实际情况输入初始化值。
代码3改为:
代码4就可以实现同代码1的功能:灵活的初始化a,b的值。
代码1和代码4实现的功能完全一样,为什么有必要存在代码4呢?构造函数不仅仅能够初始化成员变量,还可以做很多事情。而初始化列表是怎么为初始化而生的?
有这个必要么?不要初始化列表行不行?
有。不要还真不行。
因为const的存在,const类型的变量a不能使用"a=xxx"语句,而在构造函数体,就必须使用"a=xxx"语句,所以,构造函数体就无法对const初始化了,如下:
26_init_list.cc:13:66: error: assignment of read-only member 'object::a'
错误:对一个read-only 变量a 进行了赋值。
此时,就只能使用初始化列表了,如下:
这就是初始化列表存在的必要性。
其实,对于const类型的变量const int a,或者引用int &b = a;,这些不能用“a=xxx",或者"b=xxx"来赋值的变量类型,初始化列表都是有必要的。
没有初始化列表,const,引用变量就无法动态的自由的初始化了。
这就是c++的设计者让初始化列表出现在c++的一个原因吧。
初始化列表还能简化初始化的步骤?
结果为:
记住这个结果:调用test的construct前,进行了两次object类的copy constructor
更改代码,不用初始化列表,用构造函数体来初始化:
代码8中,调用construct test前, 先进行了一次copy constructor object,一次constructor object,在construct test函数体,又进行了一次类的assignment。
代码8相比代码7,初始化的流程更多,而且无法完成const成员变量a的初始化。
代码7使用了初始化列表,不仅初始化流程少,而且完成了将const a=7成功的初始化给了test的成员变量obj.
test类的两种初始化步骤的对比:
类test的使用构造函数初始化的过程有三步:1 传参数,2 初始化各成员,3 运行test构造函数体
在1时,将o1作为参数传递,参数传递其实就是从o1 copy出一个临时对象,所以有copy constructor object的调用
在2时,初始化了一个无参数的object类的对象obj。
在3时,将从o1 copy出的临时对象赋值给obj;
类test的使用初始化列表初始化的过程有二步:1 传参数,2 初始化列表copy值给成员obj
在1时,将o1作为参数传递,用copy constructor object,copy出了一个临时对象
在2时,用初始化列表将临时对象copy给了test的成员obj。
所以:
结论一:初始化列表更专业一些,可以相比用构造函数体进行初始化,初始化列表简化了初始化步骤的。
结论二:const,引用等只能用初始化列表进行初始化。
综上,初始化时,推荐用初始化列表。不推荐用构造函数体。
slam中的初始化列表
我们观察到,slam中的类的初始化,大量使用了初始化列表,如下:
我想,orb-slam3能够做到实时,初始化列表减少了大量数据的复制工作,应该也是有贡献的。
orb-slam3代码地址:https://gitee.com/anjiang2020_admin/ORB_SLAM3
参考文献:
- https://blog.csdn.net/lws123253/article/details/80368047
猜你喜欢
- 2024-10-10 C++系列1-1:初探C++ c=2μf
- 2024-10-10 浅谈C++11(第9篇 可变参数模板) c++可变参数模板类
- 2024-10-10 数组的初始化方式有哪几种? 数组的初始化是什么意思
- 2024-10-10 c++对于内建类型的默认初始化 创建内部类的对象
- 2024-10-10 C++类构造函数,如何初始化对象?linux C++第27讲
- 2024-10-10 【C++编程语言】之 类和对象——对象的初始和消除
- 2024-10-10 C++基础语法梳理:引用、封装、继承和多态
- 2024-10-10 C++核心准则?:按照成员声明的顺序定义和初始化成员变量
- 2024-10-10 C++核心准则C.47:按照成员变量声明的次序定义和初始化数据成员
- 2024-10-10 C/C++语言编程系列002——不同情况下数组的初始化方法
- 最近发表
- 标签列表
-
- gitpush (61)
- pythonif (68)
- location.href (57)
- tail-f (57)
- pythonifelse (59)
- deletesql (62)
- c++模板 (62)
- css3动画 (57)
- c#event (59)
- linuxgzip (68)
- 字符串连接 (73)
- nginx配置文件详解 (61)
- html标签 (69)
- c++初始化列表 (64)
- exec命令 (59)
- canvasfilltext (58)
- mysqlinnodbmyisam区别 (63)
- arraylistadd (66)
- node教程 (59)
- console.table (62)
- c++time_t (58)
- phpcookie (58)
- mysqldatesub函数 (63)
- window10java环境变量设置 (66)
- c++虚函数和纯虚函数的区别 (66)