学而不思则罔,思而不学则殆

有其事必有其理, 有其理必有其事

  IT博客 :: 首页 :: 联系 :: 聚合  :: 管理
  85 Posts :: 12 Stories :: 47 Comments :: 0 Trackbacks

       主要参考 Effective C++  第四条款  确定对象被使用前一辈初始化 
       Make sure that Objects are initialized before they're used

  • 成员初始化列表 member initialization list ,是用逗号分开的程序以及初始值的列表。
  • 对于大多数类型而言,只调用一次Copy 构造函数, 比起来先调default 构造函数后,在调用copy assignment 操作符,有时候高效很多。对于内置的类型,其实初始化和赋值的成本是相同。但是为了一致性也通过程序初值来初始化。
  • 对于Const  和 reference 他们一定是要有初值, 不能被赋值。 所以只能在这里了 。见代码。
      

       // 编译vc++ 2010 错误提示
      // error C2758: “CK::CNoOrderMemeberInitialization::a_ref”: 必须在构造函数基/成员初始值设定项列表中初始化
      //int & a_ref ;

      // 编译vc++ 2010 错误提示
      // error C2758: “CK::CNoOrderMemeberInitialization::MAX_LEN”: 必须在构造函数基/成员初始值设定项列表中初始化
      //const int  MAX_LEN ;

  •  class 的成员变量的总是以其声明的顺序初始化。

    #include "stdafx.h"
    #include 
    <iostream>

    //////////////////////////////////////////////////////////////////////////
    // 一个不按照 内部声明顺序 进行member initialization
    namespace CK
    {
        
    class CNoOrderMemeberInitialization
        
    {
        
    public:
            CNoOrderMemeberInitialization(
    int x, int y)
                : n_second(x) , n_first( n_second )   
    //这里先初始化n_second, 然后再给n_first赋值  ??会怎么样
            {

            }

            
    ~CNoOrderMemeberInitialization()
            
    {

            }


        
    public:
            
    int  n_first ;
            
    int  n_second ; 

            
    // 编译vc++ 2010 错误提示
            
    // error C2758: “CK::CNoOrderMemeberInitialization::a_ref”: 必须在构造函数基/成员初始值设定项列表中初始化
            
    //int & a_ref ;

            
    // 编译vc++ 2010 错误提示
            
    // error C2758: “CK::CNoOrderMemeberInitialization::MAX_LEN”: 必须在构造函数基/成员初始值设定项列表中初始化
            
    //const int  MAX_LEN ;
        }
    ;
    }




    int _tmain(int argc, _TCHAR* argv[])
    {
        CK::CNoOrderMemeberInitialization  test(
    2 ,10) ;
        
    //期盼着 test.n_first=2  test.n_second=2
        
    //程序的输出test.n_first=-858993460  test.n_second=2
        std::cout << "test.n_first=" << test.n_first  <<"  test.n_second=" << test.n_second << std::endl ;
        
    return 0;
    }



     




posted on 2013-03-18 15:56 易道 阅读(492) 评论(0)  编辑 收藏 引用 所属分类: C/C++面试题
只有注册用户登录后才能发表评论。