C 學習筆記之作用域為類的常量和作用域內的列舉

2021-08-02 15:59:53 字數 1915 閱讀 4738

一、作用域為類的常量

有些情況下,使符號常量的作用域為類很有用。如,類宣告(不是定義)可能使用字面值30來指定陣列長度,由於該常量對於所有物件來說都是相同的,因此建立乙個由所有物件共享的常量是個不錯的主意,也許我們想像下面這樣做:

複製**

1 class weather

2 複製**

要注意的是,我們這是在宣告階段,需要在宣告類的時候就有乙個字元常量可以供我們使用,但是也正因為我們處於宣告階段,類的宣告只是描述一下類的形式,並不給資料成員分配任何值(可以想象函式宣告來理解,只是告訴編譯器,函式名字,引數的型別,幾個引數,這都是來描述形式而已,並不會給引數賦值,類也是類似),真正給資料成員分配值是在用這個類建立乙個物件的時候(就如同真正給函式引數分配值的時候是在呼叫該函式的時候),因為只有建立物件後,才會分配在乙個空間給你儲存物件資料,否則就沒有這個儲存空間,所以上述宣告,雖然表面上給months賦了乙個值12,但是還沒有建立物件,就沒有儲存值得空間(好比你對派出所宣告你家將要出生乙個小孩,但是在小孩真正出生之前,派出所是不會給「小孩」分配戶口一樣),於是,months其實沒有值,那麼用乙個沒有的值來宣告陣列的大小,當然是不對的。

有問題,就有辦法,有兩種方式可以實現這個目標,效果相同。

第一種方法是在類中宣告乙個列舉。在類中宣告(不是定義哦)的列舉的作用域為整個類,如下:

複製**

1 class weather

2 ; //宣告乙個列舉

5 double temperature[months];

6 …

7 }複製**

有的讀者會疑惑,不是說了,宣告的時候不給資料成員分配值嗎,怎麼會這樣?這也正是要注意的,用這種方式宣告列舉不會建立類資料成員,也就是說在用這個類建立物件時,所有物件中都不包含列舉,months只是乙個符號名稱,即乙個符號常量(而不是變數),在類的作用域之內,**遇見它時,編譯器將用12來替換它。也許還有讀者疑惑,符號常量不需要儲存空間嗎?事實上,就是不需要,所謂符號常量,就是用乙個字串來替換程式中出現的識別符號,和巨集定義類似,記憶體中沒有以符號常量命名的儲存空間,上述程式,就是遇見months就替換為12而已。

第二種方法是使用關鍵字static:

複製**

1 class weather

2 複製**

不是說好,宣告時,物件沒有建立,所以沒地存放值嗎?這就是static的特性,它宣告的變數是不依賴於物件的,也就是說它不儲存在物件的空間中,它與其他靜態變數(static)儲存在一起,也就是說這個變數屬於這個類,而不是屬於具體的物件,但是這個類建立的物件當然可以使用它,打個比方,staic宣告的靜態變數就好比你們村口的一口百年古井,你用或者不用它,它就在那裡,它屬於整個村的,而不是村里的某乙個人,但是呢,村里的每乙個人都可以在裡面打水,它當然不需要派出所給它分配戶口,哈哈……

二、作用域內的列舉(c++11)

注:c++11是2023年建立的c++新標準,在c++98基礎上做了改動而成。

傳統的列舉存在一些問題,其中之一就是連個列舉中定義的列舉量可能發生衝突,如:

1 enum egg ;

2 enum t_shirt ;

將無法通過編譯,因為egg small和t_shirt small位於相同的作用域內,它們將發生衝突。c++11提供了一種新列舉,作用域為類,如:

1 enum class egg ;

2 enum class t_shirt ;

也可使用關鍵字struct代替class. 無論哪種方式,都需要使用列舉名來限定列舉量:

1 egg choice = egg::large; //the large enumerator of the egg enum

2 t_shirt floyd = t_shirt::large; //the large enumerator of the t_shirt enum

列舉量的作用域為類後,不同列舉定義中的列舉量就不會發生衝突了。

作用域為類的常量

例如,類宣告可能使用字面值30來指定陣列的長度,由於該常量對於所有物件來說都是相同的,因此建立乙個由所有物件共享的常量是個好主意,你可能以為以下做法是可行的 class bakery 但這樣實際上是不行的,因為宣告類只是描述了物件的形式,並沒有建立物件。因此,在建立物件前,沒有用於儲存值的空間。下面...

作用域為類的常量

在類內定義的資料成員和成員函式,其作用域為整個類,即只在該類中是可知的,在類外是不可知的。使符號常量的作用域為整個類,常規的變數宣告方法不可行,class bakery double costs months 用這種方式不會建立類資料成員。也就是說,所有物件中都不包含列舉。months只是乙個符號名...

2 變數的作用域和常量

變數的作用域1 按作用域劃分 變數分區域性變數和全域性變數 區域性變數 處於 塊2 中的變數就是區域性變數,生命週期伊始於左半括號開始直到右半括號結束變數生命週期結束空間被釋放 全域性變數生命週期伴隨整個程式起始到結束 4種常量 字面常量 浮點型別字面常量3 3.14 帶f的浮點數,型別是float...