构造函数在初始化成员的时候,鼓励使用初始化列表
    对象成员及其初始化的实例

C++构造函数的初始化列表的学习_枚举常量让所有对象共享

    const成员、引用成员初始化必须在构造函数的初始化列表中进行。
 
    构造函数初始化列表初始化的步骤:
      1.初始化段
      2.普通计算段
 
Clock.h
 
  1. //Clock.h 
  2. # ifndef _CLOCK_H_ 
  3. # define _CLOCK_H_ 
  4.  
  5. class Clock 
  6. public
  7.     Clock(int hour = 0,int minute = 0, int seond = 0); 
  8.     ~Clock(); 
  9.  
  10.     void Display(); 
  11.     void Init(int hour, int minute, int second); 
  12.     void Update(); 
  13.  
  14.     int GetHour(); 
  15.     int GetMinute(); 
  16.     int GetSecond(); 
  17.  
  18.     void SetHour(int hour); 
  19.     void SetMinute(int minute); 
  20.     void SetSecond(int Second); 
  21.  
  22. private
  23.     int hour_; 
  24.     int minute_; 
  25.     int second_; 
  26. }; 
  27.  
  28. # endif //_CLOCK_H_ 
Clock.cpp
 
  1. //Clock.cpp 
  2. # include "Clock.h" 
  3. # include <iostream> 
  4. using namespace std; 
  5.  
  6. void Clock::Display() 
  7.     cout << hour_ <<":"<<minute_<<":"<<second_<<endl; 
  8.  
  9. //初始化列表,初始化段 
  10. Clock::Clock(int hour, int minute, int second):hour_(hour),minute_(minute),second_(second)
  11.     //hour_ = hour; 不是真正的初始化 
  12.     //minute_ = minute;只是简单的赋值 
  13.     //second_ = second; 
  14.     cout <<"Clock::Clock" << endl;//普通计算段 
  15.  
  16. Clock::~Clock() 
  17.     cout<< "Clock::~Clock "<< endl;      
  18.  
  19. void Clock::Init(int hour, int minute, int second) 
  20.     hour_ = hour; 
  21.     minute_ = minute; 
  22.     second_ = second; 
  23.  
  24. void Clock::Update() 
  25.     second_++; 
  26.     if(second_ == 60) 
  27.     { 
  28.         minute_++; 
  29.         second_ = 0; 
  30.     } 
  31.     if(minute_ == 60) 
  32.     { 
  33.         hour_++; 
  34.         minute_ = 0; 
  35.     } 
  36.     if(hour_ == 24) 
  37.     { 
  38.         hour_ = 0; 
  39.     } 
  40.  
  41. int Clock::GetHour() 
  42.     return hour_; 
  43.  
  44. int Clock::GetMinute() 
  45.     return minute_; 
  46.  
  47. int Clock::GetSecond() 
  48.     return second_; 
  49.  
  50. void Clock::SetHour(int hour) 
  51.     hour_ = hour; 
  52.  
  53. void Clock::SetMinute(int minute) 
  54.     minute_ = minute; 
  55.  
  56. void Clock::SetSecond(int second) 
  57.     second_  = second; 
 
main.cpp
 
  1. # include "Clock.h" 
  2.  
  3. int main(void
  4.     Clock c(10,10,10); 
  5.     c.Display();     
  6.      
  7.  
  8.     return 0; 
  9. }     
运行结果:
 

C++构造函数的初始化列表的学习_C++构造函数初始化列表_02

 
    const成员、引用成员初始化必须在构造函数的初始化列表中进行
    实例如下:
 
TEST_1.h
 
  1. # ifndef _TEST_H_ 
  2. # define _TEST_H_ 
  3.  
  4. class Object 
  5.  
  6. public
  7.     enum E_TYPE 
  8.      {//对所有对象来说都是常量 
  9.           TYPE_A = 100,   
  10.           TYPE_B = 200 
  11.      };  
  12. public
  13.     Object(int num);         
  14.     ~Object(); 
  15.  
  16.     void DisplayKNum(); 
  17.      
  18. private
  19.     int num_; 
  20.     const int kNum_;//仅限于某个对象是常量 
  21.     int& refNum_; 
  22. }; 
  23. # endif //_TEST_H_ 
TEST_1.cpp
 
  1. # include "Test_1.h" 
  2. # include <iostream> 
  3. using namespace std; 
  4.  
  5. Object::Object(int num = 0) : num_(num),kNum_(num_),refNum_(num_) 
  6. {  //本质上是赋值 
  7.          //Knum = 100; error const的初始化必须在初始化列表中初始化 
  8.          //refNum_ = num_; error 引用成员的初始化必须在初始化列表中初始化 
  9.            cout << "Object "<<num_ << "..." << endl; 
  10.  
  11.  
  12.  
  13. void Object::DisplayKNum() 
  14.         //cout << "kNum = " << kNum_ << endl; 
  15.         cout << "kNum = " << kNum_ << endl; 
  16.  
  17. Object::~Object() 
  18.         cout << "~Object "<<num_<<"..." << endl; 
main.cpp
 
  1. #include "Test_1.h" 
  2. # include <iostream> 
  3. using namespace std; 
  4.  
  5.  
  6. int main(void
  7.     Object obj1(10); 
  8.     Object obj2(20); 
  9.  
  10.     obj1.DisplayKNum(); 
  11.     obj2.DisplayKNum(); 
  12.      
  13. //针对类内部是常量,而对于所有对象都是常量要用枚举   
  14.     cout <<obj1.TYPE_A<<endl; 
  15.     cout <<obj2.TYPE_A<<endl<<endl; 
  16. //适用于任何对象,要用枚举常量 
  17.     cout <<Object::TYPE_A<<endl; 
  18.     cout <<Object::TYPE_B<<endl; 
  19.      
  20.     return 0; 
运行结果:

C++构造函数的初始化列表的学习_const私有成员的初始化_03