zoukankan      html  css  js  c++  java
  • 初始化函数列表和构造函数内赋值之区别

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

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

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

    如: 

    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; 
    是静态的,如果用构造函数体内赋值,编译会出错。 

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

    上面的例子改一改: 

    C++代码

    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 };   

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

     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的成员函数的调用:一次是缺省构造函数,另一次是赋值。 

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

  • 相关阅读:
    75.iOS内存管理
    74.CocoaPods安装和使用教程
    73.解决Xcode10 library not found for -lstdc++ 找不到问题
    eclipse中启动tomcat,不能访问localhost解决办法
    点对点模式
    点对点架构模式
    淘宝网分析质量属性场景
    架构漫谈读后感
    《探索需求》阅读笔记6
    《探索需求》阅读笔记5
  • 原文地址:https://www.cnblogs.com/debuging/p/3238464.html
Copyright © 2011-2022 走看看