溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

C++類常量和類枚舉怎么理解

發(fā)布時(shí)間:2022-01-04 00:36:41 來(lái)源:億速云 閱讀:155 作者:柒染 欄目:開發(fā)技術(shù)

這篇文章給大家介紹C++類常量和類枚舉怎么理解,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。

1.類常量

有的時(shí)候, 我們希望能給類當(dāng)中定義一些常量,可以給所有類的對(duì)象使用。

比如說(shuō)我們?cè)陬惍?dāng)中定義一個(gè)數(shù)組,希望可以定義一個(gè)常量,用來(lái)初始化數(shù)組的長(zhǎng)度。既然是用來(lái)初始化數(shù)組長(zhǎng)度的,那么這個(gè)值自然也不會(huì)改變,我們定義成const是否可行呢?

比如這樣:

class P {
    private:
     const int N=15;
     int costs[N];
    ...
}

很遺憾,這樣不行,編譯器會(huì)拋出一個(gè)錯(cuò)誤:

C++類常量和類枚舉怎么理解

說(shuō)我們non-static變量N用的不對(duì),看到了吧?報(bào)錯(cuò)信息里的描述是non-static變量,也就是說(shuō)我們這里定義的N不是一個(gè)static類型的,所以不能用來(lái)初始化數(shù)組。

那怎么樣才算對(duì)了呢?很簡(jiǎn)單,我們可以定義成static變量就對(duì)了。

class P {
    private:
     static const int N=15;
     int costs[N];
    ...
}

也就是在const int前面加上了static關(guān)鍵字,表示這是一個(gè)static即靜態(tài)變量。這個(gè)常量會(huì)和其他靜態(tài)變量存儲(chǔ)在一起,而不是存儲(chǔ)在對(duì)象里,這樣的話也就被所有對(duì)象共享了。

對(duì)于像是Java、Python等其他語(yǔ)言來(lái)說(shuō),類中的靜態(tài)變量是可以通過(guò)類名直接訪問(wèn)的,而C++中不行。

除了定義靜態(tài)變量之外,還有一種方法就是定義類枚舉:

class P {
    private:
     enum {N=15};
     int costs[N];
    ...
}

這樣也能運(yùn)行,看起來(lái)非常不可思議。

通過(guò)這種方式聲明并不會(huì)創(chuàng)建類數(shù)據(jù)成員,對(duì)于類的對(duì)象來(lái)說(shuō),并不包含枚舉,這里的N只是一個(gè)符號(hào)名稱。在類當(dāng)中遇到它的時(shí)候,編譯器會(huì)用15來(lái)代替。

也正是因?yàn)槲覀冎皇菫榱藙?chuàng)建符號(hào)常量,而不是創(chuàng)建枚舉類型的變量,所以不需要提供枚舉名。有一些C++的類庫(kù)當(dāng)中也用到了這種方法,比如ios_base::fixed等。

2.類枚舉

傳統(tǒng)的枚舉類型變量存在一定的問(wèn)題,最大的問(wèn)題是當(dāng)兩個(gè)枚舉定義中的枚舉量重名的時(shí)候,就會(huì)發(fā)生沖突:

enum A {small, big, medium};
enum B {small, large, xlarge};

這兩個(gè)枚舉類型當(dāng)中都有small,如果位于相同的作用于,那么就會(huì)發(fā)生沖突。

為了避免這個(gè)問(wèn)題,C++11當(dāng)中提供了一種新枚舉,它的作用域?yàn)轭?,聲明類似這樣:

enum class A {small, big, medium};
enum class B {small, large, xlarge};

和上面的代碼幾乎是一樣的,只不過(guò)多了一個(gè)關(guān)鍵字class,換成struct也是可以的。

當(dāng)我們使用的時(shí)候,需要加上解析運(yùn)算符:

A choice = A::small;
B c = B::large;

另外我們前面說(shuō)過(guò),常規(guī)的枚舉將自動(dòng)轉(zhuǎn)化為整型,比如賦值給int變量或者是用于比較表達(dá)式的時(shí)候。而作用域內(nèi)枚舉不會(huì)隱式地轉(zhuǎn)換類型。

關(guān)于C++類常量和類枚舉怎么理解就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

c++
AI