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(inth); 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的描述)。