書名: 高質量程序設計指南:C++/C語言作者名: 林銳 韓永泉編著本章字數: 619字更新時間: 2019-01-09 14:09:02
5.4 類中的常量
有時我們希望某些常量只在類中有效。由于 #define定義的宏常量是全局的,不能達到目的,于是可能想當然地會覺得應該用const修飾數據成員來實現。const數據成員的確是存在的,但其含義卻不是我們所期望的。非靜態const數據成員是屬于每一個對象的成員,只在某個對象的生存期限內是常量,而對于整個類來說它是可變的,除非是static const。因為類可以創建多個對象,不同的對象其const數據成員的值可以不同。
不能在類聲明中初始化非靜態const數據成員。示例5-5的用法是錯誤的,因為在類的對象被創建之前,編譯器無法知道SIZE的值是什么。
示例5-5
class A { … const int SIZE=100; // 錯誤,企圖在類聲明中初始化const數據成員 int array[SIZE]; // 錯誤,未知的SIZE };
非靜態const數據成員的初始化只能在類的構造函數的初始化列表中進行,見示例5-6。
示例5-6
class A { … A(int size); // 構造函數 const int SIZE ; }; A::A(int size):SIZE(size) // 構造函數的初始化列表 { … } A a(100); // 對象a的SIZE值為100 A b(200); // 對象b的SIZE值為200
那么,怎樣才能建立在整個類中都恒定的常量呢?這就別指望const數據成員了,應該用類中的枚舉常量來實現,見示例5-7。
示例5-7
class A { … enum { SIZE1=100, // 枚舉常量 SIZE2 = 200 }; int array1[SIZE1]; int array2[SIZE2]; };
枚舉常量不會占用對象的存儲空間,它們在編譯時會被全部求值,更何況它定義的是一個匿名枚舉類型。枚舉常量的缺點是不能表示浮點數(如PI=3.14159)和字符串。
還可以使用另一種方法來定義類的所有對象都共享的常量,即static const,見示例5-8。
示例5-8
class A { public:// 有些語言實現可能不支持這樣的初始化,如Visual C++ static const int SIZE1=100; // 靜態常量成員 static const int SIZE2=200; // 靜態常量成員 private: int array1[SIZE1]; // 普通成員 int array2[SIZE2]; // 普通成員 };
推薦閱讀
- Mastering Concurrency Programming with Java 8
- Spring 5.0 By Example
- Boost C++ Application Development Cookbook(Second Edition)
- Reactive Programming with Swift
- Software Testing using Visual Studio 2012
- Java從入門到精通(第4版)
- 64位匯編語言的編程藝術
- INSTANT Mercurial SCM Essentials How-to
- HTML5+CSS3+JavaScript Web開發案例教程(在線實訓版)
- Android Native Development Kit Cookbook
- BIM概論及Revit精講
- C# Multithreaded and Parallel Programming
- MINECRAFT編程:使用Python語言玩轉我的世界
- Scratch·愛編程的藝術家
- ActionScript 3.0從入門到精通(視頻實戰版)