常數(shù)據(jù)成員的使用及初始化
常的概念我們在學C語言時候就有了解,關(guān)鍵字是const,所謂的“常”,或者說被“?!毙揎椀淖兞?,是不可以被改變的,比如用const修飾的一個變量就成了常變量,這個值不可被更改。
那么C++中,一樣有常的概念,額外不同的是,const除了可以修飾一般的變量為常變量之外,還可用于修飾某個對象,變成常對象。以及可以修飾類的數(shù)據(jù)成員和成員函數(shù),分別叫做類的常數(shù)據(jù)成員和常成員函數(shù)。
下面,我們依次對常數(shù)據(jù)成員、常成員函數(shù)、常對象展開講解。
1. 常數(shù)據(jù)成員:
對于常數(shù)據(jù)成員的用法,與我們在C語言的用法一樣,只不過這部分數(shù)據(jù)出現(xiàn)在類里,使用的格式如下:
數(shù)據(jù)類型 const 數(shù)據(jù)成員名;
或
const 數(shù)據(jù)類型 數(shù)據(jù)成員名;
被const修飾的成員則必須進行初始化,并且不能被更改,而初始化的方式則是在類的構(gòu)造函數(shù)的初始化列表里進行的。
另外,有一個特殊情況,如果成員是static類型,即靜態(tài)常數(shù)據(jù)成員,因為是靜態(tài)的屬性,初始化則需在類外進行初始化。下面我們把剛才講的情況放到代碼里來說明:
#include<iostream> using namespace std; class Clock { private: const int h; //修飾h為常類型成員 const int m; //修飾m為常類型成員 int const s; //和上面兩種用法都可以 static const int x; public: Clock(int a,int b,int c):h(a),m(b),s(c) { cout<<"Constrctor! Called"<<endl; } int ShowTime() { cout<<h<<":"<<m<<":"<<s<<endl; return 0; } int GetX() { cout<<x<<endl; return 0; } }; const int Clock::x = 99; int main() { Clock A(12,10,30); A.ShowTime(); A.GetX(); return 0; }
運行演示結(jié)果:
大家注意看類中的四個常數(shù)據(jù)成員,其中X為static類型,因其靜態(tài)化的特殊屬性則需要在類外初始化,即便X為私有類型!
2. 常對象:
C++中可以把一個對象聲明為const類型,即常對象。這樣聲明之后,這個對象在整個生命周期中就不可以再被更改,所以在定義的時候要由構(gòu)造函數(shù)進行初始化,定義格式如下:
類型 const 對象名;
或
const 類型 對象名;
需要注意的是,常對象不可以訪問類中的非常成員函數(shù),只能訪問常成員函數(shù)(后面第三部分)。下面我們看例子:
#include<iostream> using namespace std; class Clock { private: const int h; //修飾h為常類型成員 const int m; //修飾m為常類型成員 int const s; //和上面兩種用法都可以 int x; public: Clock(int a,int b,int c):h(a),m(b),s(c) { x=99; cout<<"Constrctor! Called"<<endl; } int ShowTime() { cout<<h<<":"<<m<<":"<<s<<endl; return 0; } int GetX() const { //x=99; cout<<x<<endl; return 0; } }; int main() { const Clock A(12,10,30); const Clock B(14,20,50); //A = B; //A.ShowTime(); A.GetX(); return 0; }
注意看代碼中39,40行的語句,正常編譯將報錯,原因是A為常對象不可以被賦值,以及ShowTime函數(shù)為非常成員函數(shù)。而41行的代碼則可以執(zhí)行,效果如下:
3. 常成員函數(shù):
類似的,一個類中的成員函數(shù)被const修飾后,就變成了常成員函數(shù),常成員函數(shù)的定義如下:
返回類型 函數(shù)名(形參表列) const;
需要注意:
(1)常成員函數(shù)的定義和聲明部分都要包含const;
(2)常成員函數(shù)只能調(diào)用常成員函數(shù),而不能調(diào)用非常成員函數(shù),訪問但不可以更改非常成員變量。
比如以下代碼:
#include<iostream> using namespace std; class Clock { private: const int h; //修飾h為常類型成員 const int m; //修飾m為常類型成員 int const s; //和上面兩種用法都可以 int x; public: Clock(int a,int b,int c):h(a),m(b),s(c) { x=99; cout<<"Constrctor! Called"<<endl; } int ShowTime() { cout<<h<<":"<<m<<":"<<s<<endl; return 0; } int GetX() const { //x=99; cout<<x<<endl; return 0; } }; int main() { const Clock A(12,10,30); A.GetX(); return 0; }
注意第29、30行代碼,如果使用29行代碼則會編譯報錯,實際運行效果如下:
C++中常概念的建立,明確了程序中各對象的變與不變的邊界,也加強了C++程序的安全性和可控性。
請大家自行上機實驗。
C語言網(wǎng)提供由在職研發(fā)工程師或ACM藍橋杯競賽優(yōu)秀選手錄制的視頻教程,并配有習題和答疑,點擊了解:
一點編程也不會寫的:零基礎(chǔ)C語言學練課程
解決困擾你多年的C語言疑難雜癥特性的C語言進階課程
從零到寫出一個爬蟲的Python編程課程
只會語法寫不出代碼?手把手帶你寫100個編程真題的編程百練課程
信息學奧賽或C++選手的 必學C++課程
藍橋杯ACM、信息學奧賽的必學課程:算法競賽課入門課程
手把手講解近五年真題的藍橋杯輔導課程