C++設(shè)計(jì)的核心在于引入了類的概念,為程序猿們提供了自定義數(shù)據(jù)類型的空間,借助類的實(shí)現(xiàn),奠定了面向?qū)ο缶幊痰幕?,使得程序的編寫、擴(kuò)展、維護(hù)都更加方便。今天就來簡(jiǎn)單總結(jié)下這部分內(nèi)容,時(shí)間緊忙里偷閑看的,揀自己感覺重要的來寫吧。 一、類的定義和聲明 類背后蘊(yùn)含的基本思想是數(shù)據(jù)的抽象與封裝。數(shù)據(jù)抽象,將接口/方法的使用和實(shí)現(xiàn)分離開來,使得設(shè)計(jì)者和使用者各司其職,設(shè)計(jì)者專注于類的設(shè)計(jì)與實(shí)現(xiàn),使用者則只需要關(guān)心如何使用類提供的接口。數(shù)據(jù)封裝,將數(shù)據(jù)成員利用private標(biāo)號(hào)保護(hù)起來,外部的函數(shù)方法不可見,有效地保護(hù)了類自身的數(shù)據(jù)。數(shù)據(jù)抽象和封裝密切不可分,某種意義上,正是由了數(shù)據(jù)的抽象提供的公共接口才使得數(shù)據(jù)可以被封裝在類內(nèi)。二者結(jié)合的好處就是:數(shù)據(jù)成員封裝有效避免了無意的、可能破壞對(duì)象狀態(tài)的用戶級(jí)錯(cuò)誤(用戶無法直接接觸類的核心數(shù)據(jù));程序的修改、擴(kuò)展以及維護(hù)都只需要關(guān)注類的內(nèi)部,極大地減少了后期需要的成本。 這部分另一個(gè)比較重要的是類定義與類聲明的區(qū)別。如果從編譯器的角度來看,類聲明是告訴這個(gè)類型不是“黑戶”,類定義則是正式為合法戶口安排“住”的空間。因此,經(jīng)過聲明的類只是不完全體,只有定義之后才真正可用。定義對(duì)象時(shí)必須在進(jìn)行了類的定義之后(說明了類的數(shù)據(jù)成員和成員函數(shù))。一般來說,只有在類定義之后,數(shù)據(jù)成員才能被聲明為該類型,因此,類中是不能含有自身類型的數(shù)據(jù)成員的;但是對(duì)于引用和指針而言,她們只需要聲明就可以了,而類名已出現(xiàn)恰恰就可以認(rèn)為是類的聲明了: class A { ... ... } class B { A class-obj-A; //A類型的數(shù)據(jù)成員 A *next; //引用和指針 A &class-obj-B; } 二、類作用域 C++中的變量可能出現(xiàn)在成員函數(shù)中、類中以及全局中,因此當(dāng)遇到一個(gè)變量進(jìn)行名稱解析時(shí),C++遵循以下規(guī)則: 1. 檢查成員函數(shù)局部作用域中的聲明 2. 如果在成員函數(shù)中找不到,則檢查對(duì)所有類成員的聲明 3. 如果在類中仍舊找不到該名字的聲明,則檢查在此成員函數(shù)定義之前的作用域中出現(xiàn)的聲明 比如下面的例子: 點(diǎn)擊(此處)折疊或打開
三、構(gòu)造函數(shù) 其實(shí)對(duì)于構(gòu)造函數(shù)有很多值得注意的,比如構(gòu)造函數(shù)的原型(不能有返回值,名稱與類名一致),比如構(gòu)造函數(shù)利用形參列表進(jìn)行重載,利用初始化列表進(jìn)行類成員的初始化等等。這些都是最基本也是最重要的東西,今天來說說別的。自己看C++ Primer就是一本入門書,但是講的非常詳細(xì)。這部分需要特別留意默認(rèn)構(gòu)造函數(shù)。 我們知道,當(dāng)我們沒有定義構(gòu)造函數(shù)的時(shí)候,C++會(huì)使用默認(rèn)構(gòu)造函數(shù),默認(rèn)構(gòu)造函數(shù)會(huì)為數(shù)據(jù)成員賦予初始值,對(duì)于類類型來說,直接調(diào)用其默認(rèn)構(gòu)造函數(shù);內(nèi)置和復(fù)合類型的成員,比如指針和數(shù)組,只對(duì)定義再全局作用域中的對(duì)象才初始化,當(dāng)對(duì)象定義在局部作用域時(shí),內(nèi)置或復(fù)合類型的成員不會(huì)進(jìn)行初始化。所以這就提醒我們:在構(gòu)造函數(shù)中利用初始化列表初始化內(nèi)置或復(fù)合類型的數(shù)據(jù)成員。 四、友元 我們經(jīng)常需要訪問一個(gè)全局的變量,比如某個(gè)計(jì)數(shù)器,或者某個(gè)特定的數(shù)值等,如果使用全局變量,就會(huì)破壞對(duì)用戶級(jí)錯(cuò)誤的保護(hù)。但是我們可以使用友元類型聲明需要全局訪問的函數(shù)和類。友元可以修飾在類上,則友元類的函數(shù)可以方位自身的private成員;也可以修飾在其他類的某個(gè)成員函數(shù),則有同樣的效果。這里需要注意是,當(dāng)生命友元類時(shí),應(yīng)當(dāng)首先聲明該類,然后才能將該類聲明為新一個(gè)類友元類。 五、static成員 static成員很重要,最需要注意的是static成員屬于類而更不屬于類的對(duì)象。因此當(dāng)然不能對(duì)其使用this指針,也不能聲明為const函數(shù)(沒有對(duì)應(yīng)的操作對(duì)象)。另外一個(gè)需要注意的是,static變量只能在類定義體內(nèi)聲明,在類定義體外定義,并且在體外定義時(shí)不能再重復(fù)聲明static屬性(當(dāng)然也有const static的例外)。 |
|