1. 程式人生 > >c++入門之類——進一步剖析

c++入門之類——進一步剖析

通常的,關於一個類,包含了下面幾個方面:

1  宣告類成員和介面;2 定義類介面函式(方法)3通過介面呼叫類

下面先給出第一條:宣告類成員和介面

 1 # ifndef MYTIME0_H_
 2 # define MYTIME0_H_
 3 
 4 class Time
 5 {
 6 private:
 7     int hours;
 8     int minutes;
 9 public:
10     Time();
11     Time(int h, int m = 0);
12     void AddMin(int m);
13     void AddHr(int
h); 14 void Reset(int h = 0, int m = 0); 15 Time Sum(const Time &t) const; 16 void Show() const; 17 18 }; 19 # endif

關於該類宣告:

1  主要到類成員放在private中,類介面放在public中(private中的成員不允許通過外部對其訪問)。很多時候,採用這樣的方式使得邏輯更清晰

2  public宣告中,有Time()函式,函式名Time和類名相同,說明這是建構函式,用於完成類初始化定義(在建立類物件之前,會首先呼叫建構函式初始化物件,然後才能生成物件)

3  public中,有兩個Time()函式,他們均為建構函式,且使用了函式過載的功能(函式名相同,特徵標不同),實際建立物件呼叫時會採取最佳匹配準則。

4  注意第15行程式碼,在類宣告中,就允許產生該類定義的形參(這裡是引用變數t),注意到,這裡的函式的返回型別是Time類(建立類的初衷就是讓類變的可以和基本型別一樣操作自如,因此可以認為這裡和int等沒有區別)

疑惑:

A  搞清1,2,19行的程式碼究竟起到什麼作用???

B 15,16行的程式碼,const為什麼放在函式名的後面,有什麼作用???

下面先給出第二條:定義類介面函式

 1
# include "iostream" 2 # include "mytime0.h" 3 4 Time::Time() 5 { 6 hours = minutes = 0; 7 } 8 9 Time::Time(int h, int m) 10 { 11 hours = h; 12 minutes = m; 13 } 14 15 void Time::AddMin(int m) 16 { 17 minutes += m; 18 hours = minutes / 60; 19 minutes = minutes % 60; 20 } 21 22 void Time::AddHr(int h) 23 { 24 hours = hours + h; 25 } 26 27 void Time::Reset(int h, int m) 28 { 29 hours = h; 30 minutes = m; 31 } 32 33 Time Time::Sum(const Time &t)const 34 { 35 Time sum; 36 sum.minutes = minutes + t.minutes; 37 sum.hours = hours + t.hours + sum.minutes / 60; 38 sum.minutes = sum.minutes % 60; 39 return sum; 40 } 41 42 void Time::Show()const 43 { 44 using std::cout; 45 using std::endl; 46 std::cout << hours << "hours," << minutes << "minutes" << endl; 47 }

關於該類介面函式定義:

1 注意第二行,要將.h標頭檔案包含進去,雖然這個cpp檔案同樣是標頭檔案

2 注意在定義介面函式的時候,涉及到類作用域的問題,即我們所定義的介面函式,都是類中的函式,因此需要用類作用域限定介面函式,::為作用域運算子。(作用域保證了一個域內的東西和另一個域中同名的東西不會衝突)

3 兩個Time()建構函式是沒有函式返回型別的

4  注意,函式 返回型別 是寫在 類名 前面的!!!

5  33-39行程式碼,請仔細分析:注意開頭的兩個Time,第一個表示函式的返回型別,第二個限定類作用域,引數採用引用變數可以佔用更少的記憶體,因此在使用類這種複雜的資料結構的時候,通常會使用引用變數。

6  39行返回了一個Time型別的資料,要注意return返回的機制:返回結束返回之前,區域性變數和臨時物件會被銷燬,(return 變數)則建立了變數的副本,返回副本值。所以這裡不能返回Time&,即time引用。

7  類介面函式中,可以使用類成員變數。

小結:

不要返回指向區域性變數或臨時物件的引用。函式執行完畢後,區域性變數會被銷燬,引用將指向不存在的資料。

下面先給出第三條:通過介面呼叫類

 1 # include "iostream"
 2 # include"mytime0.h"
 3 
 4 int main()
 5 {
 6     using std::cout;
 7     using std::endl;
 8     Time planning;
 9     Time coding(2, 40);
10     Time fixing(5, 55);
11     Time total;
12 
13     cout << "planninf time =";
14     planning.Show();
15     cout << endl;
16 
17     cout << "coding time =";
18     coding.Show();
19     cout << endl;
20 
21     cout << "fixing time =";
22     fixing.Show();
23     cout << endl;
24 
25     total = coding.Sum(fixing);
26     cout << "total time =";
27     total.Show();
28     cout << endl;
29 
30     system("pause");
31     return 0;
32 
33 }

關於該類呼叫:

1  開頭仍然要包含類宣告標頭檔案

2  第8行程式碼宣告planning物件時,建構函式使用第一個Time函式,9,10行宣告時,採用第二個Time函式。

3  當我們看到coding.Show()這樣的一行程式碼時,想到的應該是:首先,之前通過最優匹配的建構函式,初始化了coding物件的成員(這一步很關鍵),然後,show()方法可在其函式內部呼叫初始化好了的coding成員。

3  注意第25行程式碼:隱式呼叫了conding物件自己的成員,顯示將fixing物件作為引數傳遞進去(承接3的描述)。