1,類的組合:
1,類不是孤立存在的,類之間都會有一些關系,組合就是類的基本關系之一;
2,電腦一般而言是由 CPU、內存、主板、鍵盤和硬盤等部件組合而成;
3,學習電腦組裝需要多少時間?學習電腦組裝是否需要學習顯示器、鍵盤、鼠標、主板、內存等部件的設計與制造?
1,我們可以使用一個類,但是可能對類的內部狀態一無所知;
2,類的封裝:
1,類通常分為以下兩個部分:
1,類的實現細節;
1,使用者往往可以忽略;
2,類的使用方式;
2,當使用類時,不需要關心其實現細節;
1,普通用戶使用手機:
1,只需要學習如何發短信、打電話、拍照等;
2,對類的使用者而言,簡單且能夠滿足需求才可以,如果太復雜,則不會有人使用這個類;
3,封裝對於類的使用者而言是非常重要的概念,必須知道當我們創建類的 時候,一定要將復雜的實現細節全部封裝在內部,不讓使用者知道,對於使用者而言我們留給他們的就是一些非常簡單的使用方式就可以了,這就是類的封裝;
3,當創建類時,才需要考慮其內部實現細節;
1,手機開發工程師:
1,需要考慮手機內部的實現細節;
3,封裝的由來:
1,根據經驗:並不是類的每個屬性都是對外公開的;
1,如:女孩兒不希望外人知道自己的體重和年齡;
2,如:男孩兒不希望別人知道自己的身高和收入;
2,而一些類的屬性是對外公開的:
1,如:人的姓名、學歷、國籍等;
3,必須在類的表示法中定義屬性和行為的公開級別:
1,類似文件系統中文件的權限;
2,“公開級別”就是封裝的體現;
4,C++ 中類的封裝:
1,肯定要對類的行為和屬性進行封裝,所以定義的訪問級別要作用於成員變量和成員函數;
1,C++ 中已經可以對類成員進行訪問級別的定義了;
2,成員變量:C++ 中用於表示類屬性的變量;
3,成員函數:C++ 中用於表示類行為的函數;
4,C++ 中可以給成員變量和成員函數定義訪問級別:
1,public:
1,成員變量和成員函數可以在類的內部和外界訪問和調用;
2,private:
1,成員變量和成員函數只能在類的內部被訪問和調用;
3,這兩個關鍵字體現了封裝的概念;
5,類成員的訪問屬性編程實驗:
1 #include <stdio.h> 2 #include <stdio.h> 3 4 struct Biology 5 { 6 bool living; 7 }; 8 9 struct Animal : Biology 10 { 11 bool movable; 12 13 void findFood() 14 { 15 } 16 }; 17 18 struct Plant : Biology 19 { 20 bool growable; 21 }; 22 23 struct Beast : Animal 24 { 25 void sleep() 26 { 27 } 28 }; 29 30 struct Human : Animal 31 { 32 void sleep() 33 { 34 printf("I'm sleeping...\n"); 35 } 36 37 void work() 38 { 39 printf("I'm working...\n"); 40 } 41 }; 42 43 struct Girl : Human 44 { 45 private: 46 int age; 47 int weight; 48 public: 49 void print() 50 { 51 age = 22; 52 weight = 48; 53 54 printf("I'm a girl, I'm %d years old.\n", age); 55 printf("My weight is %d kg.\n", weight); 56 } 57 }; 58 59 struct Boy : Human 60 { 61 private: 62 int height; 63 int salary; 64 public: 65 int age; 66 int weight; 67 68 void print() 69 { 70 height = 175; 71 salary = 9000; 72 73 printf("I'm a boy, my height is %d cm.\n", height); 74 printf("My salary is %d RMB.\n", salary); 75 } 76 }; 77 78 int main() 79 { 80 Girl g; 81 Boy b; 82 83 g.print(); 84 85 b.age = 19; 86 b.weight = 120; 87 //b.height = 180; 88 89 b.print(); 90 91 return 0; 92 }
6,類成員的作用域:
1,類成員的作用域都只在類的內部,外部無法直接訪問;
1,所以類成員函數可以直接訪問成員變量和成員函數;
2,外部函數要通過對象(除了靜態成員函數通過類訪問)來訪問類的成員;
3,類的內部還是外部的判斷依據是:是否定義在類的里面;
2,成員函數可以直接訪問成員變量和調用成員函數;
3,類的外部都可以通過類變量訪問 public 成員;
4,類成員的作用域與訪問級別沒有關系:
1,類的作用域僅是為了說明在類的內部是可以訪問的,不管有沒有訪問級別;
2,訪問級別僅僅是為了外部函數訪問類的成員而准備;
1,C++ 中用 struct 定義的類中所有成員默認為 public;
7,類成員的作用域編程實驗:
1 #include <stdio.h> 2 3 int i = 1; 4 5 struct Test 6 { 7 private: 8 int i; 9 10 public: 11 int j; 12 13 int getI() 14 { 15 i = 3; 16 17 return i; 18 } 19 }; 20 21 int main() 22 { 23 int i = 2; // 定義的第四個 i 24 25 Test test; 26 27 test.j = 4; 28 29 printf("i = %d\n", i); // i = 2; 30 printf("::i = %d\n", ::i); // ::i = 1; 訪問默認的命名空間、也就是全局作用域,其沒有名字; 31 // printf("test.i = %d\n", test.i); // Error 32 printf("test.j = %d\n", test.j); // test.j = 4 33 printf("test.getI() = %d\n", test.getI()); // test.getI() = 3 34 35 return 0; 36 }
1,對於類而言是有作用域的,類的作用域僅僅指的是類的成員變量和成員函數 的作用域,在整個類中;
2,類外部訪問類內部成員必須同過對象(或類)來訪問;
3,總而言之:
1,類的內部:通過類的作用域訪問,與訪問級別無關;
2,類的外部:通過類的對象(或類)訪問,有訪問級別的限制;
8,小結:
1,類通常可以分為使用方式和內部細節兩部分;
2,類的封裝機制使得使用方式和內部細節相分離;
1,通過封裝給類成員定義訪問級別,以 public 成員作為使用方式,以 protected 和 private 作為內部細節;
2,只有這樣,我們的程序設計才可能簡單、產生的 bug 才可控;
3,C++ 中通過定義類成員的訪問級別實現封裝機制;
4,public 成員可以在類的內部和外界訪問和調用;
5,private 成員只能在類的內部被訪問和調用;