既然构造函数初始化列表和构造函数体内赋值均可以对成员变量赋值,那么两者有何区别,是否是两者等效呢?
1、若类的数据成员是静态的(const)和引用类型,必需用初始化列表
静态(const)的数据成员只能初始化而不能赋值,一样引用类型也是只能够被初始化,那么只有用初始化列表。
如: ios
C++代码函数
1 #include <iostream> 2 #include <string> 3 using namespace std; 4 5 template<class t> 6 class namedptr { 7 public: 8 namedptr(const string& initname, t *initptr); 9 private: 10 const string name; //静态数据成员的初始化必需用初始化列表 11 t * const ptr; 12 }; 13 14 15 16 template<class t> 17 namedptr<t>::namedptr(const string& initname, t *initptr ) 18 : name(initname), ptr(initptr) 19 {}
因为 const string name; //静态数据成员的初始化必需用初始化列表
t * const ptr;
是静态的,若是用构造函数体内赋值,编译会出错。
2、构造函数体内赋值会带来额外的开销,效率会低于构造函数初始化列表
上面的例子改一改:
spa
C++代码code
1 template<class t> 2 class namedptr { 3 public: 4 namedptr(const string& initname, t *initptr); 5 private: 6 string name; //静态数据成员的初始化必需用初始化列表 7 t * ptr; 8 };
而且用这两中初始化方法作对比:blog
1 //第一种方法:初始化列表 2 template<class t> 3 namedptr<t>::namedptr(const string& initname, t *initptr ) 4 : name(initname), ptr(initptr) 5 {} 6 7 //第二种方法是在构造函数体内赋值: 8 9 template<class t> 10 namedptr<t>::namedptr(const string& initname, t *initptr) 11 { 12 name = initname; 13 ptr = initptr; 14 }
当用第二种方法初始化数据成员时会两次对string的成员函数的调用:一次是缺省构造函数,另外一次是赋值。
而用第一种方法(初始化列表)只是一次调用缺省的构造函数,并不会调用赋值函数。会减小没必要要的开支,当类至关复杂时,就会看出使用初始化列表的好处string