天天看點

C++程式設計常見錯誤之-類中的常量

1.const與#define的比較

兩點:

1.cosnt常量有資料類型,而宏常量沒有資料類型,編譯器可以對前者進行靜态資料類型安全檢查,而對後者隻進行字元替換,沒有安全檢查,并且會在字元替換時可能會産生意料不到的錯誤(邊際效應)。

2.有些內建化的調試工具可以對const常量進行調試,但是不對宏常量進行調試。

2.類中的常量

2.1錯誤用法:

//類中的常量
class A
{
public:
    const int SIZE = ;  //注意,并非期望的全局常量,因為每個類都會會有這樣一個常量
    int array[SIZE];  //錯誤,未知的SIZE,因為在類的對象被建立之前,編譯器無法知道SIZE的值是什麼

};
           

2.2常量正确用法一 類中枚舉常量

class A
{
public:
    enum
    {
        SIZE1 = ,  //枚舉常量
        SIZE2 = 

    };

    int array1[SIZE1];
    int array2[SIZE2];

};
           

提示:枚舉常量不會占用對象的存儲空間,它在編譯時會被全部求值,更何況它定義的是一個匿名枚舉類型。

枚舉類型的缺點是:不能表示浮點數(如PI=3.14159)和字元串。

2.3常量正确用法二  static const

class A
{
public:

    static const int SIZE1 = ; //枚舉常量
    static const int SIZE2 = ;


    int array1[SIZE1];
    int array2[SIZE2];

};
           

提示:有的編譯器可能會要求必須在類外初始化靜态資料成員。

另外3.1

,在C和C++中定義常量是有差別的。

在C程式中const符号常量定義的預設連接配接類型(Linkage)是extern的,即外連結(extern Linkage)就像全局變量一樣。如果在源檔案中定義定義,除非明确改變它的連接配接類型為内連接配接,否則其他編譯單元就可以通過extern聲明來通路它。

但是在C++程式中,const 符号常量定義的預設連接配接類型卻是static的,即内連接配接。

3.2

什麼常量最浪費空間呢?答案是字元串常量,尤其是較長的字元串常量。

是以我們常常這樣定義它們:

const char* const NO_MEMORY="There is no enough memory!";
           

常量可以在頭檔案中定義和初始化,也可以在源檔案中定義并初始化,但是兩者差别較大:

①如果在頭檔案中定義并初始化,那麼包含了頭檔案的每一個編譯單元不僅會為每一個常量指針常量建立一個單獨的拷貝項,而且也會為長長的字元串常量建立一個獨立的拷貝項,就相當于在每一個編譯單元内分别定義和初始化每一個常量一次。

②如果在頭檔案中聲明所有常量指針常量,而在源檔案中定義并初始化它們,則每一個包含該頭檔案的編譯單元通路的不僅是常量指針常量的唯一實體,而且字元串常量常量也是唯一實體,這樣就大大節省了記憶體,而且不影響效率。

繼續閱讀