天天看點

C++常資料成員精講—const關鍵字

C++常資料成員精講—const關鍵字
 
 内容提要:
 用const修飾的定義對象稱為常對象;
 用const修飾的聲明成員函數稱為常成員函數;
 用const修飾的聲明資料成員稱為常資料成員。
 變量或對象被 const修飾後其值不能被更新。是以被const修飾的變量或對象必須要進行初始化。
 用const修飾的聲明資料成員稱為常資料成員。
 有兩種聲明形式:
 const int  cctwl;
 int const  cctwl;
 int cctwl  const; //這樣是錯誤的隻能有以上兩種聲明形式。不能省略資料類型,可以添加 public private等通路控制符。
 說明:
 1.任何函數都不能對常資料成員指派。
 2.構造函數對常資料成員進行初始化時也隻能通過初始化清單進行。
 3.常資料成員在初始化時必須指派或稱其必須初始化.
 4.如果類有多個預設構造函數必須都初始化常資料成員。
 通過下面例子來了解常資料成員以上4點。
 A、請指出下面程式的錯誤
 class A
 {
 private:
 int w,h;
       const int cctwl=5;  //錯誤一
 public:
 };
 void main()
 {   
          A a ;   //錯誤二   
        cout<< "sss";
          system("pause");
 }
 錯誤一:不能對常資料成員在類中初始化、要通過類的構造函數,隻有靜态常量才能這樣初始化。
 錯誤二:沒有合适的預設構造函數可用。因為有常量cctwl沒有初始化必須初始化所有常資料成員。
 更正後結果如下:
 class A{
 private:
     int w,h;
     const int cctwl;
  public:
   const int cctwlcom;//常對象可以是共有私有等通路權限
   A():cctwl(5),cctwlcom(8){};//通過構造函數初始化清單初始化常成員資料。
 };
 B、多個構造函數下的常資料成員
 請指出下面程式的錯誤:
 class A{
 private:
     int w,h;
      const int  cctwl;
 public:
     const int cct;
     A():cctwl(5),cct(6){};
     
 A(int x,int y) //錯誤一    
 {
          w=x,h=y;
     }
 };
 void main()
 {
     A a ;
     A b(3,8);
     cout<< "sss";
     system("pause");
 }
 錯誤一:每個構造函數都要初始化常資料成員應改為
 A(int x,int y):cctwl(7),cct(8)
  {
     w=x,h=y;
  }


                                 C++常成員函數 - const 關鍵字  
  
 一、常成員函數詳解
 聲明:<類型标志符>函數名(參數表)const;
 說明:
 (1)const是函數類型的一部分,在實作部分也要帶該關鍵字。
 (2)const關鍵字可以用于對重載函數的區分。
 (3)常成員函數不能更新任何資料成員,也不能調用該類中沒有用const修飾的成員函數,隻能調用常成員函數和常資料成員。
 A、通過例子來了解const是函數類型的一部分,在實作部分也要帶該關鍵字。
 class A{
 private:
     int w,h;
 public:
     int getValue() const;
     int getValue();
     A(int x,int y)
     {
         w=x,h=y;
     }
     A(){}
 };
 int A::getValue() const    //實作部分也帶該關鍵字
 {
     return w*h; //????
 }
 void main()
 {
     A const a(3,4);
     A c(2,6);
 cout<<a.getValue()<<c.getValue()<<"cctwlTest"; 
 system("pause");
 }
 B、通過例子來了解const關鍵字的重載
 class A{
 private:
     int w,h;
 public:
 int getValue() const
 {
         return w*h;
     }
     int getValue(){
         return w+h;
     }
     A(int x,int y)
     {
         w=x,h=y;
     }
     A(){}
 };
 void main()
 {   
     A const a(3,4);
     A  c(2,6);
     cout<<a.getValue()<<c.getValue()<<"cctwlTest"; //輸出12和8
     system("pause");
 }
 C、通過例子來了解常成員函數不能更新任何資料成員
 class A{
 private:
     int w,h;
 public:
     int getValue() const;
     int getValue();
     A(int x,int y)
     {
         w=x,h=y;
     }
     A(){}
 };
 int A::getValue() const
 {
     w=10,h=10;//錯誤,因為常成員函數不能更新任何資料成員
     return w*h;
 }
 int A::getValue()
 {
     w=10,h=10;//可以更新資料成員
     return w+h;
 }
 void main()
 {
      A const a(3,4);
     A  c(2,6);
     cout<<a.getValue()<<endl<<c.getValue()<<"cctwlTest";                            system("pause");
 }
 D、通過例子來了解
 1、常成員函數可以被其他成員函數調用。
 2、但是不能調用其他非常成員函數。
 3、可以調用其他常成員函數。
 class A{
 private:
     int w,h;
 public:
     int getValue() const
  {
    return w*h + getValue2();//錯誤的不能調用其他非常成員函數。
  }
     int getValue2()
     {
         
         return w+h+getValue();//正确可以調用常成員函數
     }
     
     A(int x,int y)
     {
         w=x,h=y;
     }
     A(){}
 };
 void main()
 {
     A const a(3,4);
     A       c(2,6);
 cout<<a.getValue()<<endl<<c.getValue2()<<"cctwlTest";                    
 system("pause");
 }