C++常數據成員精講—const關鍵字

用const修士的定義對象成爲常對象;(兩種聲明方式)

const Point point1( 10,10);//常量對象
	Point const point2( 10,10);//常量對象
用const修飾的聲明成員函數成爲常成員函數;
class Point
{
	int x, y;
public:
	Point(int a, int b) { x=a; y=b;}
	void MovePoint( int a, int b){ x+=a; y+=b;}
	void print() const { cout<<"x="<<x<<"y="<<y<<endl;}
};
用const修飾的聲明數據成員成爲常數據成員;
注意:變量或對象被const修飾後其值不能被更新(除非數據成員被mutable修飾時,可以被修改)。因此被const修飾的變量或者對象要進行初始化。

說明: 
   1 任何函數能對常數據成員賦值
    2 構造函數對常數據成員進行初始化時也只能通過初始化列表進行。
    3 常數據成員在定義時必須賦值或稱爲必須初始化。
    4 如果累有多個默認構造函數必須都初始化常數據成員。
通過下面例子來理解常數據成員:(借用網友實例)
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 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;

說明: 

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



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章