官术网_书友最值得收藏!

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];             // 普通成員
            };
主站蜘蛛池模板: 曲水县| 柯坪县| 利津县| 神农架林区| 大余县| 三原县| 盐城市| 湛江市| 峨边| 西乌珠穆沁旗| 雷波县| 岫岩| 嘉定区| 凤阳县| 云霄县| 庄浪县| 南江县| 邓州市| 金堂县| 凯里市| 社旗县| 汽车| 邯郸县| 潞西市| 洪江市| 万年县| 辽阳县| 台中市| 巢湖市| 吴旗县| 岚皋县| 鹤山市| 恭城| 龙口市| 尉氏县| 正宁县| 房产| 松滋市| 阿图什市| 双鸭山市| 通海县|