c 入門之淺入淺出類 分享給很多想形象理解的人

2022-05-02 16:30:09 字數 4066 閱讀 7441

引入類之前,首先引入乙個古老的話題:類別,比如int ,char ,double;這些基本的型別方便了我們描述資料(請注意,這句話很重要),型別的存在就是為了方便我們描述資料的。而c++中的類其實作用也是:方便我們描述資料。因此,我們可以這麼認為:引入類的作用,就是為了讓我們可以像使用int 這些型別一樣,來描述我們想要表達的資料。儘管很多時候我們需要把我們想描述的資料抽象化。因此,我們有理由將類和int,char這些基本型別一視同仁(這個思想是很重要的!!!,但要在程式設計的時候認識到這點並不容易

)。而實質上,引入類的初衷:

就是讓我們能夠像使用基本型別使用我們定義的類,並能夠像基本型別那樣操作自如。

再看乙個基本的話題:比如定義了乙個變數 ,比如int x;很不幸的是,我們已經養成了習慣,習慣把x叫作「變數」,同樣的把int叫作型別,這對我們認識和使用類造成了很大的不便。在類中,也會定義類變數,但我們把它叫物件。

比如,我們定義貓科動物為一類:class cat{};通常型別名大寫,請注意,這裡的cat是我們定義的類,或者說是型別。即cat和int,char等並無差異性。比如我們可以通過這個cat型別,定義一些貓科動物。比如cat cat(就是定義了貓),cat tiger(定義了老虎)。我們發現:貓和老虎都是貓科動物(就像1和2都是整數一樣)。這裡的cat,tiger,我們稱之為物件。其實想叫作變數也可以,但還是跟著叫物件吧。

接下來,通過一段**初步認識類:

1

# ifndef stock00_h

2#define stock00_h

3 # include "

string"4

class

stock515

public:16

stock::stock();

17void acquire(const std::string &co, long n, double

pr);

18void buy(long num, double

price);

19void sell(long num, double

price);

20void updata(double

price);

21void

show();

22};

23#endif

//ifbdef...endif成對出現

這段**定義了乙個名叫stock的類。首先,我們在這個**中看到的是:public和private,中文意思公共和私有(這種描述和其功能很吻合)。共有的意思是對外公開的,客戶可以對其訪問的。我們也把這個叫做介面。私有的意思是使用者對其不可直接訪問的。上面**可以看到:我們在private中定義了很多基本型別變數。我們把這些基本型別變數叫做資料成員。而public中定義的是函式成員,我們也叫做方法。當然不一定非要把資料成員都放在private中,而把函式成員都放在public中,取決於你想讓使用者訪問什麼。關於這方面,請具體參考c++ prime,並通過自己的實戰體會。

在此,僅僅總結這麼個東西(很重要):我們定義了乙個類,比如貓科動物。我們首先想到的肯定是:既然是貓科動物,首先肯定要有一些描述它的資訊:比如體重啊,毛色啊,名字啊(假如有),甚至眼睛大小啊等等。而這些其實本質上,就是我們說的資料成員,即我們需要定義一些基本型別變數來描述我們的類具有哪些特徵。但是現在,我們是物件導向程式設計:我們需要封裝。假如現在有乙個使用者手上有乙隻具有這些特徵的值的貓,他想根據這些資料知道這個貓幾歲了???。這便引入了這樣乙個問題:我們類的存在不只是為了儲存乙隻貓的各類型別的值。(那樣的話我們直接用結構體就好了,為何要使用類呢???),我們是想根據這些值能 做些什麼比較方便的事,而這些事最終被反饋到使用者。那麼成員函式的存在就是:利用這些基本型別變數,完成某項工作。但使用者並不需要知道怎麼完成,我只需要知道貓有幾歲???知道貓有幾歲這個工作毫無疑問是通過函式完成的,或者說我們用什麼方法(函式)來知道貓有幾歲(過度很自然)。比如有乙個函式indicate_age()可以幫我們做這件事,則使用者可以通過呼叫類——貓中的indicate_age()方法來實現這個願望。這一點也表明了,這個indicate_age()方法要放在public,這樣使用者才有訪問使用它的許可權。(假如使用者不想讓人知道名字,可以放在private中)

(如果清閒,可以思考python中定義類有何異同)

請注意,上面那段**中public中只是宣告了函式原型,但是並沒定義這些函式,當然我們可以在public中直接定義,但沒必要,顯得很囉嗦。下面給出這些函式的定義:

1 # include "

iostream

"2 # include "

stock00.h"3

4void stock::acquire(const std::string &co, long n, double

pr)5

13else

14 shares =n;

15 share_val =pr;

16set_tot();17}

1819

void stock::buy(long num, double

price)

2026

else

2732}33

34void stock::sell(long num, double

price)

3542

else

if (num>shares)

4347

else

4853}54

55void stock::updata(double

price)

5660

61void

stock::show()

6268

69stock::stock()

70

我們重新用乙個檔案來定義這些函式:具體的細節不再贅述,想描述的是每個函式的抬頭,都採用了stock::,這其實是表明這些函式的作用域是類作用域,比如我們外面也宣告了acquire()函式,那麼兩者是可以區分的。這個類作用域十分重要,具體的可以參考c++ prime,

在這裡,我們發現,給出的第乙個**中,有這樣乙個函式:stock::stock(),這個函式對類的資料成員進行了賦值(實際上就是初始化)。這個函式有兩個特點:1 沒有返回型別;2 名字和類的名字要一致。我們把這種函式叫建構函式。實際編寫**中,我們有時候沒有寫建構函式,但是貌似並不是報錯,但這並不意味著建構函式是非必須的。實際上,建構函式是必須的。我們在建立類 物件的時候(就是定義類 變數的時候)將先自動呼叫建構函式(即由系統自動呼叫),然後才能生成我們的類 物件。也就是建構函式是用來被建立物件的,從而建構函式是不能通過物件去呼叫的。這一是十分重要的。關於建構函式耳朵顯示,和隱式初始化可以參考c++ primer。

上面完成了對乙個類的定義。下面給出呼叫它的**:

1 #  include"

iostream

"2 # include"

stock00.h"3

intmain()

4

上面的**是多麼的簡潔,假如我們是客戶,我們只需要知道類方法怎麼使用即可,即怎麼呼叫介面,就能知道我們的貓有幾歲。站在使用者的角度講,這段程式很簡單!!!而這,就是類產生的目的!!!

c++中類的誕生是一種很重要的思想,而所有關於c++類相關的,最重要的思想在於:能夠讓我們像使用其他類一樣方便的使用我們定義的自己資料型別。認識到這一點的重要性在於:當我們思想中認識到我們自己建立的類和int,char並無區別的時候,就意味著,int,char ,double這些基本型別所有的操作,定義的類物件也應該有:比如,初始化,賦值,甚至比較大小。具有指標,具有資料(類陣列),可以將類作為函式的返回值和引數。所以,我們思考類的角度,應該從資料和結構的角度去思考!

關於類:還想說明兩點很重要的地方:

1  宣告類只是建立了物件的形式,而非建立物件本身。因此,在建立物件之前,我們所定義的東西,是不被分配記憶體空間的,比如當我們宣告int型別的時候,只有定義了 int i,i才有記憶體空間

2  關於類的作用域。在很多地方,都討論過作用域。作用域到底意味著什麼???作用域意味著變數的生存週期,意味著作用域與作用域之間的獨立性。而類的作用域,乙個最明顯的特徵是,當我們定義類方法的時候,採用的是:classname ::funcname  這樣的限定方式,這樣即使兩種方法使用了同乙個名字,但由於處於不同的類作用域中,兩者的同時存在並不衝突!

CSS 之 淺入淺出

css,層疊樣式表 英語 cascading style sheets,簡寫css 又稱串樣式列表 層次結構式樣式表檔案,一 種用來為結構化文件 如html文件或xml應用 新增樣式 字型 間距和顏色等 的計算機語言。層疊 是指乙個 檔案的樣式可以從其他的樣式表中繼承下來。讀者在有些地方可以使用他自...

容器淺入深出之LinkedList

list介面下的主要兩個實現類,arraylist已經討論過了。這次再看看linkedlist的底層實現 linkedlist所實現的介面和繼承的父類和arraylist差不多,但是它多實現了乙個deque介面 linkedlist是基於鍊錶實現的,其中每個元素其實是每個節點內部的element,l...

C 深入淺出之指標

1 指標陣列 char str 10 指標陣列,顧名思義是乙個陣列,其元素是乙個指標。上述 是定義乙個指標陣列,其陣列元素為指向字元的指標。所謂指標陣列,重頭戲在於陣列,指標可以抽象為修飾符,那麼如何來理解指標陣列呢?很簡單,的優先順序高於 因此先被結合,加上陣列名,就構成了陣列。2 陣列指標 in...