专业编程基础技术教程

网站首页 > 基础教程 正文

「c++」初始化列表为什么要设计在c++中?以及其用在slam中的位置

ccvgpt 2024-10-10 05:02:24 基础教程 8 ℃

什么是初始化列表?

初始化列表用来初始化类的成员变量.

先看一下类的成员变量初始化的方法:

「c++」初始化列表为什么要设计在c++中?以及其用在slam中的位置

代码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

参考文献:

  1. https://blog.csdn.net/lws123253/article/details/80368047

最近发表
标签列表