C++中常資料的使用及初始化
常資料成員的使用及初始化
常的概念我們在學C語言時候就有了解,關鍵字是const,所謂的“常”,或或者說被“常”修飾的變數,是不可修改、被改變的,比如用const修飾的一個變數就成了常變數,這個值不可被更改。
那麼C++中,一樣有常的概念,額外不同的是,const除了可以修飾一般的變數為常變數之外,還可用於修飾某個物件,變成常物件。以及可以修飾類的資料成員和成員函式,分別叫做類的常資料成員和常成員函式。
下面,我們依次對常資料成員、常成員函式、常物件展開講解。
- 常資料成員
對於常資料成員的用法,與我們在C語言的用法一樣,只不過這部分資料出現在類裡,使用的格式如下:
資料型別 const 資料成員名;
或 const 資料型別 資料成員名;
被const修飾的成員則必須進行初始化,並且不能被更改。
而初始化的方式則是在類的建構函式的初始化列表裡進行的。
另外,有一個特殊情況,如果成員是static型別,即靜態常資料成員,因為是靜態的屬性,初始化則需在類外進行初始化。
下面我們把剛才講的情況放到程式碼裡來說明:
include
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"<
執行演示結果:
changshuju.png
大家注意看類中的四個常資料成員,其中X為static型別,因其靜態化的特殊屬性則需要在類外初始化,即便X為私有型別!
2.常物件
C++中可以把一個物件宣告為const型別,即常物件。這樣宣告之後,這個物件在整個生命週期中就不可以再被更改,所以在定義的時候要由建構函式進行初始化。
定義格式如下:
型別 const 物件名;
或 const 型別 物件名;
需要注意的是,常物件不可以訪問類中的非常成員函式,只能訪問常成員函式(後面第三部分)。下面我們看例子:
include
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"<
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函式為非常成員函式。而41行的程式碼則可以執行,效果如下:
changduixiang.png
3常成員函式
類似的,一個類中的成員函式被const修飾後,就變成了常成員函式,常成員函式的定義如下:
返回型別 函式名(形參表列)const;
需要注意:
常成員函式的定義和宣告部分都要包含const;
常成員函式只能呼叫常成員函式,而不能呼叫非常成員函式,訪問但不可以更改非常成員變數。
比如如下程式碼:
include
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"<
int main() { const Clock A(12,10,30); A.GetX(); return 0; } 注意第29、30行程式碼,如果使用29行程式碼則會編譯報錯,實際執行效果如下:
changfangfa.png
C++中常概念的建立,明確了程式中各物件的變與不變的邊界,也加強了C++程式的安全性和可控性。
請大家自行上機實驗。
相關文章
- 【C++】 20_初始化列表的使用C++
- MySQL資料庫部署及初始化相關MySql資料庫
- 深度學習中常見的 Normlization 及權重初始化相關知識(原理及公式推導)深度學習ORM公式
- Oracle中常用的資料型別Oracle資料型別
- CGO實戰專案中常用的資料轉換和使用Go
- 雲化的Mysql如何初始化使用者資料MySql
- 資料探勘中常用的取樣方法
- Oracle GoldenGate安裝應用及初始化資料示例OracleGo
- 工作中常用的oracle資料庫sqlOracle資料庫SQL
- 談談JavaScript中常見的資料型別JavaScript資料型別
- 資料結構中常用的數學公式資料結構公式
- 資料庫及使用者的建立資料庫
- drf中常用的欄位及用法
- c++中使用建構函式初始化列表的情況C++函式
- cosnt成員資料的初始化
- 資料探勘中常犯的十一大錯誤
- C++基本資料型別及型別轉換C++資料型別
- Visual C++ MFC 中常用巨集的含義C++
- MyCat資料庫的基礎配置及使用資料庫
- AIX中常用的SMIT的使用AIMIT
- MongoDB 初始化資料同步MongoDB
- 資料庫表初始化資料庫
- oa資料庫初始化資料庫
- postgresql資料庫初始化SQL資料庫
- PG資料庫初始化資料庫
- C++ vector 列表初始化C++
- C++ 初始化函式的實現C++函式
- C++ 使用 hiredis 封裝redis 的資料獲取介面C++Redis封裝
- sklearn中常用資料預處理方法
- 資料分析中常見的錯誤是什麼(一)
- Python中常用的資料分析工具(模組)有哪些?Python
- 使用RMAN或資料泵初始化OGG目標庫
- Scott使用者及其物件和資料初始化指令碼物件指令碼
- Python資料分析入門(十四):資料分析中常用圖Python
- MongoDB安裝以及資料初始化海量資料MongoDB
- Recoil 預設值及資料級聯的使用
- 資料泵的TRANSFORM引數說明及使用ORM
- 更新關聯資料初始化