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