1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > C++中构造函数初始化列表与构造函数体的区别

C++中构造函数初始化列表与构造函数体的区别

时间:2019-10-18 18:27:38

相关推荐

C++中构造函数初始化列表与构造函数体的区别

既然构造函数初始化列表和构造函数体内赋值都可以对成员变量赋值,那么二者有何区别,是不是二者等效呢?

构造函数可以分两个阶段进行:(1)初始化阶段;(2)普通计算阶段。计算阶段也就是由函数体内所有的语句组成。不管成员是否在构造函数初始化列表中显式初始化,类的数据成员初始化总是在初始化阶段进行,初始化阶段先于计算阶段。构造函数初始化列表是对类的成员做初始化,而在构造函数体内只是对类的数据成员进行了一次赋值操作。

构造函数初始化列表只是指定了成员的初始值,并没有指定初始化顺序,那么成员初始化顺序又是怎样的呢?成员的初始化顺序就是定义成员的顺序,第一个定义的成员首先被初始化,然后是第二个等等。

一、若类的数据成员是静态的(const)和引用类型,必需用初始化列表

静态(const)的数据成员只能初始化而不能赋值,同样引用类型也是只可以被初始化,那么只有用初始化列表。

如:

C++代码 #include<iostream> #include<string> usingnamespacestd; template<classt> classnamedptr{ public: namedptr(conststring&initname,t*initptr); private: conststringname;//静态数据成员的初始化必需用初始化列表 t*constptr; }; template<classt> namedptr<t>::namedptr(conststring&initname,t*initptr) :name(initname),ptr(initptr) {} //第二种方法是在构造函数体内赋值: //template<classt> //namedptr<t>::namedptr(conststring&initname,t*initptr) //{//name=initname; //ptr=initptr; //} intmain() { inta=10; namedptr<int>Test("SHENZHEN",&a); }

由于 const string name; //静态数据成员的初始化必需用初始化列表

t * const ptr;

是静态的,如果用构造函数体内赋值,编译会出错。

二、构造函数体内赋值会带来额外的开销,效率会低于构造函数初始化列表

上面的例子改一改:

C++代码 template<classt> classnamedptr{ public: namedptr(conststring&initname,t*initptr); private: stringname;//静态数据成员的初始化必需用初始化列表 t*ptr; };

并且用这两中初始化方法做对比:

C++代码 //第一种方法:初始化列表 template<classt> namedptr<t>::namedptr(conststring&initname,t*initptr) :name(initname),ptr(initptr) {} //第二种方法是在构造函数体内赋值: template<classt> namedptr<t>::namedptr(conststring&initname,t*initptr) { name=initname; ptr=initptr; }

当用第二种方法初始化数据成员时会两次对string的成员函数的调用:一次是缺省构造函数,另一次是赋值。

而用第一种方法(初始化列表)只是一次调用缺省的构造函数,并不会调用赋值函数。会减少不必要的开支,当类相当复杂时,就会看出使用初始化列表的好处。

hzhsan注:区别不只上面这些!!!

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