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