300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > C++类构造函数初始化列表及初始化成员变量的误区

C++类构造函数初始化列表及初始化成员变量的误区

时间:2023-03-05 05:00:34

相关推荐

C++类构造函数初始化列表及初始化成员变量的误区

构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式。例如:

[cpp]view plaincopyclassCExample{public:inta;floatb;//构造函数初始化列表CExample():a(0),b(8.8){}//构造函数内部赋值CExample(){a=0;b=8.8;}};

上面的例子中两个构造函数的结果是一样的。上面的构造函数(使用初始化列表的构造函数)显式的初始化类的成员;

而没使用初始化列表的构造函数是对类的成员赋值,并没有进行显式的初始化。

初始化和赋值对内置类型的成员没有什么大的区别,像上面的任一个构造函数都可以。对非内置类型成员变量,为了避免两次构造,推荐使用类构造函数初始化列表。

但有的时候必须用带有初始化列表的构造函数:

1.成员类型是没有默认构造函数的类。若没有提供显示初始化式,则编译器隐式使用成员类型的默认构造函数,若类没有默认构造函数,则编译器尝试使用默认构造函数将会失败。

2.const成员或引用类型的成员。因为const对象或引用类型只能初始化,不能对他们赋值。 或者改为static。

【常量必须在构造函数的初始化列表里面初始化 或 设置成static】

例子:

class A{const int size = 0;//错误}class A{A(){ const int size = 9; }}或者class A{static const int size = 9;}

初始化列表的成员初始化顺序:

C++初始化类成员时,是按照声明的顺序初始化的,而不是按照出现在初始化列表中的顺序。跟初始化列表的顺序无关

Example:

[cpp]view plaincopyclassCMyClass{CMyClass(intx,inty);intm_x;intm_y;};CMyClass::CMyClass(intx,inty):m_y(1),m_x(m_y){}你可能以为上面的代码将会首先做m_y=1,然后做m_x=m_y,最后它们有相同的值。

但是编译器先初始化m_x,然后是m_y,,因为它们是按这样的顺序声明的。结果是m_x将有一个不可预测的值。

有两种方法避免它,一个是总是按照你希望它们被初始化的顺序声明成员,第二个是,如果你决定使用初始化列表,总是按照它们声明的顺序罗列这些成员。这将有助于消除混淆。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。