C++常資料(函數)成員

來源:互聯網
上載者:User

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.