OOP物件導向程式設計 C

2021-05-22 14:03:33 字數 3159 閱讀 5008

oop程式設計的一些概念:

一.物件(object),這個概念可以說是物件導向裡面的最為核心的概念,如果找不著物件,又如何物件導向呢?物件,也就是你要處理的問題裡面設計的若干個因素,比如你做學生成績統計,那麼學生當然是你要考慮的物件。

二.類(class),從本質上講是先有物件才有類,因為在處理的實際程式設計問題時,你面對的是乙個個具體的物件,太多了,怎麼辦?分門別類,實現物以類聚,對了,將相同屬性的物件作為一類進行考慮,張三也好,李四也好,他們都是人的乙個例項。在具體的語言實現時,兩者的順序就需要顛倒一下了,也就是要先有類,然後才能例項化生成物件。

三.物件導向的三大特性:

3.1 封裝

所謂的封裝也就是在類的設計時,實現對於類內的資料與方法的不同許可權設定,有些資料和方法,我們不希望使用者在類的外部通過例項化去呼叫,那麼我們將它們宣告成私有的(private),這樣這些資料和方法只能被類內部的成員函式訪問,而如果希望能夠被例項訪問,那麼宣告成公有的(public),至於第三種訪問區分符(protected)保護型的,在類的繼承時應用,我們到繼承那裡說明。

與封裝有關的乙個概念是「抽象」(abstract) ,即將設計的類的最主要的功能表示出來,這些功能正是要被其他類和函式訪問的。

3.2 繼承

與繼承有關的概念是關係,關係描述了類之間的聯絡,有四種基本型別,即「繼承、組合、利用、例項化」。繼承就是說某乙個類具有了另外乙個類所有的資料和方法,當然可以修改一部分並且增加新的資料和方法。繼承分為兩種型別,即單重繼承和多重繼承。

單重繼承,即類derived繼承了類base,定義如下:

class base

class derived:public base

可見在定義繼承類時,要指明繼承了哪乙個類,並且指明繼承級別(public,protected,private),通過這三種訪問區分符的修飾,可以改變基類資料在派生類中的訪問許可權,public 繼承不會改變,protected繼承的話原來的public 資料和方法變成派生類的protected型資料和方法,其他不變,private繼承則將所有的資料和方法的訪問許可權設定為private,即這些資料和方法都不能在類的外部訪問。

派生類的構造和析構順序,首先構造基類,然後構造派生類,中間是類的作用,析構順序正好相反。

多重繼承是說乙個類繼承了兩個或者多個類的資料或者方法。在多重繼承這裡預見的主要的問題是兩個歧義性:首先,當繼承的兩個基類中含有相同的資料或者方法時,在派生類中呼叫無法區分,解決方法:指明呼叫的哪乙個類的成員變數和方法,使用作用域分解運算子;在派生類裡面重新定義該資料或者方法。第二類歧義性發生在多層繼承時,b,c繼承了a,而d又繼承了b,c,正如矩形和菱形繼承四邊形而正方形繼承了矩形和菱形,兩條繼承路徑使得基類被兩次繼承,直接訪問無法區分,解決方法:支出繼承路徑,使用虛基類(virtual)方法,在定義繼承關係時新增virtual使得基類永遠只有乙份拷貝。

3.3 多型

多型性分為兩種,即靜態多型性和動態多型性。所謂多型,也就是明明同樣乙個東西,在不同情況下有著不同的表現。

靜態多型性,即預先定義好的,通過函式過載(funcition overload)實現,函式包含了返回值、函式名稱、函式引數三個,名字多表示功能,返回值的區分不能區分函式(想象資料類的強制轉換吧)。因此過載也就是函式名稱相同而引數不同,不同可以表現在引數個數不同、引數型別不同、引數順序不同。

例如 int max(int,int)

float max(float,float)

另外我們自己定義了希望在這個新的型別上仍然能夠實現我們原有的算術運算、邏輯運算等運算子,解決機制是運算子過載,即我們可以將系統原有的運算子(不是全部)重新定義在我們自己的類上實現。如

complex  complex::operator + (const complex  & c1)

在複數類上定義了自己的加法運算。

動態多型性呢,是說在程式執行的時候有著不同的表現。涉及的乙個概念是「聯編」,也就是我們要用某乙個類的方法,一般情況下總是通過這個類的例項或者指標,這是系統必須知道這個函式是哪乙個類的,即由物件到類的過程,有些聯編在編譯時就可以,但是有些只能在程式實際執行時確定,也就是 滯後聯編。為了實現滯後聯編,我們需要將基類的函式設定為虛函式(virtual),這樣實現滯後聯編。

如類manager 和 saler 都繼承了類employee,三個類都有方法calcsalary(),程式如下:

employee * ptr;

ptr = new manager;

ptr->calcsalary();

ptr = new saler;

ptr->calcsalary().

我們希望的正是兩個函式有著不同的輸出,虛函式實現了這一點。

純虛函式,virtual calcsalary()=0;函式沒有實體,就等著在派生類裡面重新設計了,包含了乙個或者多個純虛函式的類是抽象類,抽象類不能例項化但是可以被指標指向。

四。建構函式與析構函式

建構函式和析構函式是類中特殊的兩個函式。建構函式負責對類內部的資料進行初始化,建構函式沒有返回值,名稱與類相同,可以過載。析構函式實現去初始化,在類結束前進行掃尾工作,沒有返回值型別,名稱與類相同,但是前面加~以表示否定,不能過載,不需要呼叫。

五.const關鍵字 以及volatile 關鍵字

作用有二:定義常量變數型別 const double pi = 3.1415926;

修飾引數,一般用於修飾輸入引數,使得其只能讀不能寫。

另外比較重要的:還有就是防止指標被修改

提到const就不能不說到volatile關鍵字,兩者構成了c-v qualifier(所謂的c-v限定)

話說此關鍵字乃吾心中之痛:曾被乙個牛人面到不知其意~~  捶地啊!

回來後就查詢,學習……籠統的說是告訴編譯器「不知何時會改變」

換言之,就是宣告的東西可以由外部程式改變,禁止編譯器對讀寫操作進行任何優化。

如此確定的表達乙個不確定的資訊,實屬罕見!  but, 這個不是我不知道此用法的藉口,看來還需修煉

六。static關鍵字

定義靜態函式和靜態資料,靜態資料表所有這個類的物件共同維護乙個資料,相當於這個類的全域性變數,只能通過類訪問,初始化為0。靜態函式實現了不定義物件訪問類的功能,靜態函式只能訪問靜態資料。

七.inline關鍵字

內聯函式,實現對於簡短函式的替換操作,提高速度。

這個關鍵字其實內涵也很深,與c中的define有相似的作用,但差別也很多,不僅僅是簡單的替換功效

記得和某位牛人**此函式的功效,用法時,收穫頗深……

物件導向程式設計(OOP)

物件導向程式設計 object oriented programming 作為一種新方法,其本質是以建立模型體現出來的抽象思維過程和物件導向的方法。模型是用來反映現實世界中事物特徵的。任何乙個模型都不可能反映客觀事物的一切具體特徵,只能對 事物特徵和變化規律的一種抽象,且在它所涉及的範圍內更普遍 更...

OOP物件導向程式設計

oop 達到了軟體工程的三個主要目標 重用性 靈活性和擴充套件性。元件 資料和功能一起在執行著的電腦程式中形成的單元,元件在 oop 電腦程式中是模組和結構化的基礎。抽象性 程式有能力忽略正在處理中資訊的某些方面,即對資訊主要方面關注的能力。封裝 也叫做資訊封裝 確保元件不會以不可預期的方式改變其它...

OOP 物件導向程式設計

作用 建立物件 初始化 基本概念 1.方法名和類名一致 2.沒有返回值宣告 3.呼叫 使用 new 關鍵字,本類中呼叫使用 this 4.預設有乙個無參構造,當宣告了乙個構造方法後,預設的不再提供 1.在乙個類中,方法名相同 2.引數列表不一樣 型別 順序 數量,跟引數名無關 3.跟返回值無關 三大...