3-1:类与对象入门——类的引入和类的定义以及访问限定符和封装还有对面向对象的理解
文章目錄
- 一:面向對象與面向過程
- 二:類的引入
- 三:類的定義
- (1)C++類的定義
- (2)類的兩種定義方式
- A:聲明和定義全部放在類體中
- B:定義和聲明分開放
- 四:類的訪問限定符及封裝
- (1)訪問限定符
- (2)封裝
- 五:類的實例化
- (1)類的實例化
- (2)面向對象
一:面向對象與面向過程
- 此部分屬于軟件工程重點內容,概念相當多,如果需要深入了解,請點擊跳轉【專欄必讀】軟件工程導論第六版(張海藩)專欄學習筆記目錄導航和Anki分享
- 后面介紹時,只是從編程語言的角度出發幫助大家理解。解釋的可能較為淺顯
二:類的引入
在C語言中,結構體用于把一些具有不同類型的變量組合到一起
struct Student {char _name[20];char _gender[3];int _age; }而在C++中,其結構體內不止可以定義變量,還可以定義函數、
struct Student {char _name[20];char _gender[3];int _age;void SetStudentInfo(const char* name,const char* gender,int age){strcpy(_name,name);strcpy(_gender,gender);_age=age;} };int main() {Student s;s.SetStudentInfo("Bob","男",18);return 0; }這樣,在C++中結構體就有了一個新的名字——類(因為具有了屬性和方法),同時會使用class代替struct
三:類的定義
(1)C++類的定義
根據以上敘述,在C++中,類是這樣定義的
class className {//成員函數//成員變量};//注意分號所以簡單來說,類就是屬性和方法的集合,屬性就是類中的數據,方法就是使用這些數據進行操作的函數
(2)類的兩種定義方式
A:聲明和定義全部放在類體中
注意當成員函數在類中定義時,編譯器會將其當作內聯函數處理。
class Person//人就是一個類 { public://成員函數void showinfo()//顯示這個人的信息{std::cout<<_name<<std::endl;std::cout<<_sex<<std::endl;std::cout<<_age<<std::endl;} public://成員變量char* _name;char* _sex;int _age; };B:定義和聲明分開放
這種方式最常采用
四:類的訪問限定符及封裝
(1)訪問限定符
上面類的定義中,有一個特殊的地方就是public,它叫做訪問限定符。除了public(公有),其它訪問限定符還有protected(保護)、private(私有)
訪問限定符用于修飾成員,被修飾的成員具有不同的權限,這些權限將體現在外部訪問、繼承等性質中。比如被public修飾的成員可以在類的外面直接被訪問,而被protected和private修飾的成員變量則不行
注意以下幾點
- 訪問限定符的作用域是從該訪問限定符出現的位置開始直到下一個訪問限定符為止
- class的默認訪問權限(就是沒有給出)為private,struct則為public
- 訪問限定符限制的是外面,就像鎖子防的是外人
(2)封裝
封裝是面向對象三大特性之一。封裝本質是一種管理手段,將屬性(數據)和方法(接口)有機結合起來,再隱藏他們,只對外公開接口(函數)來和其他對象進行交互)。不想給別人看的,就使用protected/private進行修飾
- 之所以C語言不適合編寫大型項目,是因為它不支持面向對象(不支持不意味著寫不出來面向對象風格的程序,比如Linux就是個典型的例子),管理能力較弱,不是函數就是數據,就拿struct來說,其默認就是public的,安全性也堪憂,總的來說,用C語言編寫項目,會感覺很亂,模塊與模塊獨立性很差
以實現數據結構為例(棧):C語言實現的棧,其方法和數據是分離的,就像一個完整的人被大卸八塊;C++實現時,一個棧就可以作為一個對象,這個對象有它的數據(例如動態增長的數組、長度、容量等),還有它的方法(例如出棧、壓棧等)。這些內容被封裝在了一起,讓人感覺很具體,而且便于管理(比如棧中的數據就會被設置為私有,因為不想被外界修改)
//stack.h class Stack//類 { public:void Init(int capacity=4);//缺省參數。聲明private: //數據私有int* _arr;int _length;int _capacity;//stack.cpp void Stack::Init(int capacity)//該方法的實現 {_arr=(int*)malloc(sizeof(int)*capacity);_length=0;_capactiy=capacity;}五:類的實例化
(1)類的實例化
類可以理解為一個房屋的圖紙,這個圖紙規定了一些基本信息(房子朝向是什么,有幾扇窗戶,房子材料是什么等等)。但圖紙終歸就是圖紙,永遠不是真實的房子(正如類僅僅是定義,并未開辟空間),所以我們要根據這個圖紙的規定,修出相應的房子
根據圖紙建造房子的過程,稱為類的實例化,類實例化后將會占用實際內存空間
//stack.h class Stack//類 { public:void Init(int capacity=4);//缺省參數。聲明private: //數據私有int* _arr;int _length;int _capacity;//stack.cpp void Stack::Init(int capacity)//該方法的實現 {_arr=(int*)malloc(sizeof(int)*capacity);_length=0;_capactiy=capacity;}//test.cpp int main() {Stack stack;stack._arr=4;//操作非法,成員是private的stack.Init();//初始化這個棧}(2)面向對象
面向對象編程:其實很多學習編程的人,對于面向過程編程和面向對象編程這兩個概念總是搞不清,具體的專業的定義在這里也不去說了,根據上面的敘述,我們可以這樣去通俗的解釋面向對象。
舉個例子:我去洗澡,如果按照面向過程的角度考慮,那么我先進入浴室,然后打開水龍,然后洗漱,然后把身體擦干,也就是說面向過程關注的是解決問題的步驟;如果用面向對象考慮,只需記住一句話,萬物皆對象,你是對象,水龍頭也是對象,所以我先傳遞力的參數給浴室門,然后門就開了,然后我在傳遞消息給水龍頭,水龍頭得到消息,放水,最后傳遞消息給毛巾,毛巾利用它吸水的特性,調用吸水方法擦干身體,也就是說面向對象關注的是對象,將一個問題拆分為不同對象,依靠參數完成對象之間的交互。
為什么要進行面向對象編程這也是一個很值得思考的問題。舉個例子,活字印刷術發明之前使用的是雕版印刷,這種方式弊端太大,如果需要改稿,那么雕版就必須重新雕刻,而活字印刷術則解決了這樣的問題,需要改動,有可能只需改動幾處。面向過程正如雕版印刷一樣,也正如做數學題一樣,中間某個環節一旦出現需求變更,那么整個工程幾乎需要大改,要耗費大量時間精力。面向對象正如活字印刷術一樣,如果需求變化了,可能只是修改其中一部分,也就是一個對象,而且最關鍵的一點是這些對象可以復用,就像活字印刷術一樣,不是說這個對象在這個工程中發揮完之后,它就沒有價值了,它還可能被其他工程所用
在面向對象編程下,一切均為對象,甚至類中的方法都是對象,所有細節均封裝在對象中,項目的更改全部由對象間信息的傳遞方式所決定
總結
以上是生活随笔為你收集整理的3-1:类与对象入门——类的引入和类的定义以及访问限定符和封装还有对面向对象的理解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CSS3: border-radius边
- 下一篇: Github上的资源清单