Cpp:const、引用绕辖、typedef和enum

一摇肌、const


考慮問題:下面程序中數(shù)字 10 的含義?

for (int i = 0; i != 10; ++i){
    //...
}
  • 顯然從程序來看仪际,我們并不知道 10 是怎樣一個存在围小,因此它也被稱為 魔數(shù)(magic number),意思是這個數(shù)的意義不能從上下文體現(xiàn)出來树碱,就像魔術(shù)一樣憑空出現(xiàn)了肯适。

  • 或者如果這個程序多次使用數(shù)字 10 的話,當(dāng)需要要把 10 改為 20 的話就麻煩了成榜。

一種簡單的解決辦法是

int max = 10;
for (int i = 0; i != max; ++i){
    //...
}

這樣不僅可讀性好很多框舔,而且修改起來也相當(dāng)方便。

max 是可以被修改的

1.1赎婚、定義const對象

上面到刘绣,max 可能會被有意或無意的修改,在某些情況下這很嚴(yán)重挣输。const 提供一種解決辦法

const int max = 10纬凤;

此時定義 max常量 并初始化為 10,但此時的 max 不可被修改歧焦。

C++中的 const 跟 Java 中的 finalPHP 中的 define 類似移斩。
const 定義的常量不可修改肚医,所以定義時必須初始化:

const std:string hi = "Hello";//正確
const int i;    //錯誤 

1.2绢馍、const對象默認(rèn)為文件的局部變量

跟普通的變量不一樣向瓷,const定義的變量需要特別的說明才可以在其他文件中訪問。例如

  • 普通變量

      //file1.cpp
      int max = 10;        //定義變量
    
      //file2.cpp
      extern int max;    //聲明外部變量
      //下面可以使用變量 max
    
  • const變量

      //file1.cpp
      extern const int max = 10;    //定義變量
    
      //file2.cpp
      extern const int max;        //聲明外部變量
      //下面可以使用const變量 max
    

定義非 const 變量時默認(rèn)問 extern舰涌。而 cost 變量必須顯式的指定它為 extern 才可以被其他文件訪問猖任。

二、引用


引用(reference)就是對象的另一個名字瓷耙。在實際程序中朱躺,引用主要作為函數(shù)的形參,形參的內(nèi)容將在后續(xù)介紹搁痛。

引用是一種 復(fù)合類型(compound type)长搀,在變量名前加 & 符號來定義。復(fù)合類型是指用其他類型定義的類型鸡典。每個引用都關(guān)聯(lián)到其他某一類型源请,不能定義引用的引用,但可以定義任意類型的引用彻况,并且可以有多個引用谁尸。下面用例子說明

int val = 1;
int &reVal1 = val;    //正確
int &reVal2 = val;    //正確:val的第二個別名

int &reVal3;        //錯誤:引用必須初始化
int &reVal4 = 1;    //錯誤:引用必須使用對象初始化

2.1、引用是別名

引用只是它所綁定對象的另一個名字纽甘,在引用上做的所有操作實際上都作用在原對象上:

reVal1 = 5良蛮;            //相當(dāng)于:val = 5;
reVal1 += 1;        //相當(dāng)于:val += 1;
int val2 = reVal1;    //相當(dāng)于:int val2 = val;

下面程序的結(jié)果更能直觀的說明這個問題

int main()
{
    int val = 0;
    int &reVal1 = val;
    int &reVal2 = val;
    std::cout << "val = " << val << ", reVal1 = "<< reVal1 << ", reVal2 = " << reVal2 << std::endl;

    reVal1 = 1;    //對 reVal1 操作
    std::cout << "val = " << val << ", reVal1 = "<< reVal1 << ", reVal2 = " << reVal2 << std::endl;

    reVal2 = 2;    //對 reVal2 操作
    std::cout << "val = " << val << ", reVal1 = "<< reVal1 << ", reVal2 = " << reVal2 << std::endl;

    return 0;
}

運行結(jié)果是:

val = 0, reVal1 = 0, reVal2 = 0
val = 1, reVal1 = 1, reVal2 = 1
val = 2, reVal1 = 2, reVal2 = 2

2.2悍赢、const引用

非 const 不能引用 const决瞳,只有 const 能夠引用 const,且 const 引用不能修改:

int i = 0;
const int val = 0;            //正確:0是右值
const int &reVal1 = val;    //正確:val是左值
const int &reVal2 = i;        //正確

reVal1 = 1;                    //錯誤:const 引用是只讀的
int &reVal3 = val;            //錯誤:非 const 不能引用 const

跟非 const 不同之處還有:

int i = 0;
const int &re1 = 1;            //正確
const int &re2 = re1 + i;    //正確

對于下面這種綁定到同一類型的情況:

int i =  0;
const int &re1 = i;    //此時 re1 = 0左权;
i = 1;                //此時 re1 = 1瞒斩;

當(dāng)改變 i 時,re1 也會被改變涮总。

還有另一種情況:綁定到不同類型的值

double i =  1.1;
const int &re1 = i;    //此時 re1 = 1胸囱;
i = 2.1;            //此時 re1 = 1;

因為對于這種情況瀑梗,編譯器會解釋為:

int temp =  i;
const int &re1 = temp;

所以烹笔,改變 i 實際上改變的是 tempre1 不受影響抛丽。

const 引用可以綁定左值或右值谤职,非 const 引用只能綁定左值。

三亿鲜、typedef


typedef 跟引用有點類似允蜈,不過 typedef 是定義類型的別名:

typedef double wages;    //wages 是 double 的別名
typedef int score;        //score 是 int 的別名
typedef wages salary;    //salary 是 double 的別名

其作用是:

  • 為了隱藏特定的類型冤吨,強調(diào)使用類型的目的;
  • 簡化復(fù)雜的類型定義饶套,易于理解漩蟆;
  • 允許一個類型用于多個目的,并且每次使用時目的明確妓蛮;

四怠李、枚舉


如果要為某屬定義一組可選擇的值,每個只對應(yīng)一種狀態(tài)蛤克,比如文件的打開狀態(tài):輸出捺癞,輸入和追加分別對應(yīng) 0,1,2。則有可能會這樣定義:

const int input = 0构挤;
const int output = 1髓介;
const int append = 2;

屬性選擇很多時這樣定義就不方便筋现,枚舉(enumeration) 是一種替代方法唐础。

4.1、定義和初始化枚舉

枚舉的關(guān)鍵字是 enum夫否,定義如下

enum open_modes {input, output, append};

默認(rèn)地彻犁,第一個枚舉成員賦值為 0,后面的依次加 1凰慈。

4.2汞幢、枚舉成員是常量

可以為一個或多個成員提供初值,初始化枚舉成員的值必須是一個 常量表達(dá)式(constant expression)微谓,整型字面值也是常量表達(dá)式森篷。

// sphere = 2, polygon = 2
enum forms {shape = 1, sphere, cylinder = 1, polygon}

4.3、每個enum都定義了一種唯一的類型

forms f1 = shape;    //正確:shape 是 forms 類型的枚舉成員
forms f2 = square;    //錯誤:square 不是 forms 類型豺型;
forms f3 = 1仲智;        //錯誤:1 是 int類型,不是forms類型

即使 1 與 shape 相關(guān)聯(lián)姻氨,但是 1 賦值給 f3 還是非法的

五钓辆、類類型


在C++中可以通過定義 類(class) 來自定義數(shù)據(jù)類型。類定義了該類型的對象包含的數(shù)據(jù)和該類型對象可以執(zhí)行的操作肴焊。標(biāo)準(zhǔn)庫類型 string前联、istream、ostream都定義成類娶眷,關(guān)于類后續(xù)詳細(xì)介紹似嗤。

本節(jié)繼續(xù)使用在 讀《C++primer》day1:快速入門 的第三部分提到的 Sales_item 類舉例。

5.1届宠、從操作開始設(shè)計類

每個類都定義了一個 接口(interface) 和一個 實現(xiàn)(implementation)烁落。接口由使用該類的代碼需要執(zhí)行組成乘粒,實現(xiàn)一般包括該類所需的數(shù)據(jù)及操作。

定義類時伤塌,通常先定義接口灯萍,即該類所提供的操作。以 Sales_item 舉例:

  • 加法 + :將兩個對象相加寸谜;
  • 輸入 >> : 讀取一個對象竟稳;
  • 輸出 << :輸出一個對象属桦;
  • 賦值 = :將一個對象賦給另一個對象熊痴;
  • 對比 ? :對比兩個對象是否屬于同一本書(函數(shù)same_isbn);

雖然現(xiàn)在我們并不能實現(xiàn)這些操作(需要更多的知識)聂宾,但可以考慮實現(xiàn)這些操作需要什么樣的數(shù)據(jù):

  • 記錄各書本的銷售冊數(shù)果善;
  • 該書的總銷售收入;
  • 計算該書的平均售價系谐;

大概就可以知道需要一個 unsigned 類型對象來記錄數(shù)的銷售冊數(shù)巾陕,一個 double 類型對象計入總收入,string 類型對象記錄書本的ISBN纪他。

5.2鄙煤、定義Sales_item類

按上一節(jié)提到的操作和數(shù)據(jù),可以這樣定義:

class Sales_item {
public:
    //各種操作在此定義
private:
    std:string isbn;
    unsigned units_sold;
    double revenue;
};

類定義以關(guān)鍵字 class 開始茶袒,后面是該類的類名梯刚,類體位于花括號內(nèi)部,花括號后面必須要跟一個分號薪寓。

新手經(jīng)常會忘記類定義后面的分號亡资!

類體可以為空,類體定義了該類型的數(shù)據(jù)和操作向叉。這些數(shù)據(jù)和操作也稱為 成員(member)锥腻,數(shù)據(jù)稱為 數(shù)據(jù)成員(data member),操作稱為 成員函數(shù)母谎。

類定義可以包含多個 private 和 public 訪問標(biāo)號(access label)瘦黑,給定的訪問標(biāo)號作用域到下一個訪問標(biāo)號出現(xiàn)時為止。類中 public 部分定義的成員在程序的任何部分都可以訪問奇唤,不是類的組成部分的代碼不能方便問 private 成員幸斥,這樣可以保證Sales_item對象不能直接操縱數(shù)據(jù)成員。

5.3冻记、使用struct關(guān)鍵字

struct 關(guān)鍵字也可以定義類類型睡毒,它是從 C 語言繼承而來。區(qū)別

  • 用關(guān)鍵字 class 定義類:定義在第一個標(biāo)號之前的所有成員都默認(rèn)為private冗栗;
  • 用關(guān)鍵字 struct 定義類:定義在第一個標(biāo)號之前的所有成員都默認(rèn)為public演顾;

struct 重新定義前面的Sales_item類:

class Sales_item {
//不需要 public 訪問標(biāo)號
private:
    std:string isbn;
    unsigned units_sold;
    double revenue;
};

用 class 和 struct 關(guān)鍵字定義類的唯一區(qū)別就在于 默認(rèn)訪問級別供搀。默認(rèn)情況下,struct 的成員為 public钠至,而 class 的成員的是 private葛虐。

END.


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市棉钧,隨后出現(xiàn)的幾起案子屿脐,更是在濱河造成了極大的恐慌,老刑警劉巖宪卿,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件的诵,死亡現(xiàn)場離奇詭異,居然都是意外死亡佑钾,警方通過查閱死者的電腦和手機西疤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來休溶,“玉大人代赁,你說我怎么就攤上這事∈揸” “怎么了芭碍?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長孽尽。 經(jīng)常有香客問我窖壕,道長,這世上最難降的妖魔是什么泻云? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任艇拍,我火速辦了婚禮,結(jié)果婚禮上宠纯,老公的妹妹穿的比我還像新娘卸夕。我一直安慰自己,他們只是感情好婆瓜,可當(dāng)我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布快集。 她就那樣靜靜地躺著,像睡著了一般廉白。 火紅的嫁衣襯著肌膚如雪个初。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天猴蹂,我揣著相機與錄音院溺,去河邊找鬼。 笑死磅轻,一個胖子當(dāng)著我的面吹牛珍逸,可吹牛的內(nèi)容都是我干的逐虚。 我是一名探鬼主播,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼谆膳,長吁一口氣:“原來是場噩夢啊……” “哼叭爱!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起漱病,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤买雾,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后杨帽,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體漓穿,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年睦尽,在試婚紗的時候發(fā)現(xiàn)自己被綠了器净。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片型雳。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡当凡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出纠俭,到底是詐尸還是另有隱情沿量,我是刑警寧澤,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布冤荆,位于F島的核電站朴则,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏钓简。R本人自食惡果不足惜乌妒,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望外邓。 院中可真熱鬧撤蚊,春花似錦、人聲如沸损话。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽丧枪。三九已至光涂,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間拧烦,已是汗流浹背忘闻。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留恋博,地道東北人齐佳。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓葵蒂,卻偏偏與公主長得像,于是被迫代替她去往敵國和親重虑。 傳聞我的和親對象是個殘疾皇子践付,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,927評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 307、setValue:forKey和setObject:forKey的區(qū)別是什么缺厉? 答:1, setObjec...
    AlanGe閱讀 1,547評論 0 1
  • importUIKit classViewController:UITabBarController{ enumD...
    明哥_Young閱讀 3,805評論 1 10
  • (1)可以定義 const 常量 (2)const 可以修飾函數(shù)的參數(shù)永高、返回值. 詳細(xì)內(nèi)容: 1、什么是const...
    幽鬼09閱讀 710評論 0 4
  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉提针,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 1,715評論 0 9
  • 一位家長向我求助:武校長命爬,晚上好!我家小孩算是一個勤快辐脖,也很自覺的孩子饲宛。老師布置的作業(yè),回家第一時間做完嗜价。剩下時間...
    武際金閱讀 2,708評論 0 16