張儉 王桂華
摘 要:隨著計算機應用領域越來越廣泛,許多軟件變得越來越復雜,代碼量也越來越龐大,開發團隊人員不斷增加,這時候面向過程的開發模式就顯得有些吃力了,于是一種稱為面向對象的軟件開發方法應運而生,這就是后來的C++,它在C語言的基礎上增加了面向對象的功能,故從某種程度上講,C語言是C++的子集。本文將主要探討用C++動態擴展C#程序的方法。
關鍵詞:C++;擴展;C#程序
C語言是一種結構化語言,它主要側重于算法和數據結構,因此C程序設計是一種面向過程的開發方式,它強調的更多的是解決問題的算法,并通過適當的數據結構將相應的過程轉化為可執行的代碼。需要注意的是,雖然C++是在C語言的基礎上發展起來的,但并不是說C++比C語言高級,兩者的編程思想和應用的領域不一樣,在各自的領域誰也不能替代誰。之所以說C++比C語言先進,只是因為面向對象設計的概念使得C++程序設計更符合設計理念。C++中的C語言相對于原來的C語言有所加強,因為它引入了重載、內聯函數等新功能,C++更是拓展了面向對象設計的內容,如類、繼承、虛函數、模板和容器類等。
1 C++語言概述
C++語言是Bjarne Stroustup在C語言的基礎上開發出來的。它引進了面向對象的概念和功能,為程序員提供了一種與傳統結構化程序設計十分不同的思維方法。C++是在C語言基礎上擴充而成的,除了一些細微的差別外,C++可以算作是C的超集。C語言功能強、效率高、風格簡潔,適用于大多數的系統程序設計任務。C++保留了C的這些優點。C++的一條設計原則是擴充C語言但不修改C語言。這樣,使得C++與C之間取得了兼容性。
面向對象程序設計一般從對象模型入手,讓這個模型能夠契合與之對應的問題空間,通過對象來描述系統空間的實體,這樣就可以通過獲取對象的狀態信息得到輸出或實現過程控制。關于對象這一概念,目前還沒有統一的定義。一般的,我們認為對象是包含現實世界物體特征的抽象實體,而這些實體具有它,ff]自己的一些屬性和相關的操作方法,比如把人抽象化為一個對象,那么它就有性別、身高、體重、年齡等屬性,并且具有說話、眨眼、動手、動腳等能力。在程序設計領域,我們不妨用這樣的等式來進行描述:對象=數據+作用于這些數據上的操作方法。
2 用C++動態擴展C#程序的方法
在C++中,用類來描述具有相同屬性和操作方法的對象的集合,即類規定了這些對象的公共屬性和方法,而對象是類的一個實例。例如,假設人是一個類,那么,具體到某個人,則這個人(比如張三)就是一個對象。類與對象之間的關系,有點類似于程序設計語言中變量類型和變量的關系。面向對象的編程方法主要具有如下幾個基本特征:
1.抽象:抽象是指在描述一個目標時,只關注我們感興趣并對我們有用的部分,不必關心其中的細節。比如,我們在做一個員工考勤系統時,對于對象員工,我們只關心他的姓名、工號以及所在的部門,而不必關心他的身高、體重等信息。抽象通常包括兩個方面,一是處理過程抽象,二是數據抽象。封裝是一種機制。封裝性是借助于一種新的結構和數據類型機制類(class)來實現的。事物的組成成分用各種數據類型存儲,對這些成分的操作用函數來實現。把一個數據結構同操作數據的函數(行為或方法)組合在一起,即把這些數據和函數封裝在一個類中,便于分辨事物的描述。這種封裝性還會保護類中的數據與函數安全,以防止外界干擾和誤用。例如,有一組數據是準備畫一個圖形所需的信息,傳統的c方法是將數據與程序分別處理,程序設計者可以直接讀取數據,但日后若發現這樣的處理結構不太好需要修改時,則需修改整個程序,而在C++中就不必如此麻煩。可通過關鍵字class重新定義類,使用原來的程序達到修改后的結果。
2.繼承:對象的一個新類從現有的類中派生,這個過程稱為類繼承。新類繼承了原始類的特性,新類稱為原始類的派生類(子類),而原始類稱為新類的基類(父類)。假如把水果抽象為一個類,并把它作為基類,那么蘋果類就可以從水果類中派生出來并成為它的子類:派生類共有三種C++類繼承方式:公有繼承(public)、私有繼承(private)和保護繼承(protected),上面的例子使用的是公有繼承。對于公有繼承,基類的公有成員和保護成員可以作為其派生類的公有成員和保護成員,派生類的成員函數可以訪問基類中的公有成員和保護成員,無法訪問基類中的私有成員,派生類的對象可以訪問基類的公有成員:對于私有繼承,基類的公有成員和保護成員都作為其派生類的私有成員,在私有繼承時,基類的成員只能由直接派生類訪問,而無法再往下繼承;對于保護繼承,基類的所有公有成員和保護成員都成為派生類的保護成員,基類的公有成員和保護成員只能被它的直接派生類成員函數或友元訪問。
構造函數和析構函數不能被繼承,因此構造派生類的對象時,需要對基類數據成員、新增數據成員和成員對象的數據成員進行初始化,派生類構造函數的參數表部分既需要包含子類某些數據成員的初始值,也要包含基類的數據成員的初始值。如果基類沒有默認的構造函數,那么派生類必須具有給基類構造函數提供參數的構造函數。
C++的繼承特性很好地解決了軟件的可重用性問題。例如,所有的Windows應用程序都有一個窗口,它們可以看作都是從一個窗口類派生出來的。但不同的應用程序都有不同的用途,有的用于文字處理,有的用于圖像處理,有的用于音頻處理等,這是由于派生出了不同的子類,而各個子類都添加了各自不同的特性。
對象和類的概念的提出,不僅有利于模塊的重用性,而且有利于方法和數據的封裝,以保證模塊具有較好的獨立性,使得程序維護和修改較為容易,對應用程序的修改僅限于類的內部,因而可以將應用程序修改帶來的影響減少到最低限度。
3.虛函數與多態性:C++的多態性是通過虛函數來實現的,虛函數允許子類重新定義成員函數,而子類重新定義父類的做法稱為覆蓋(Override),或者稱為重寫,但是,只有重寫了父類的虛函數才能體現多態性。那么,什么是虛函數呢?簡單地說,那些被“virtual”關鍵字修飾的成員函數就是所謂的虛函數。虛函數的作用是用來實現多態性(Polymorphism),多態性是將接口與實現進行分離,即以共同的方法實現,但因個體差異而采用不同的動作。
要理解好多態性,首先必須把多態性與函數重載這兩個概念區分開來。函數重載是指基于不同的參數列表(類型、個數或兩者皆不同),同一個函數名稱可以指向不同的函數定義。例如,對于如下所示的兩個同名函數Add,調用函數Add(1,2)和Add(1,2)的結果是不一致的,前者為3而后者為51。
3 結論
因此,在過去的軟件開發實踐中積累起來的大量的C的庫函數和實用程序都可以在C++中使用,而且C++語言的語法和C語言極為貼近。C語言的程序員是能夠很快和很容易地學會使用C++的。
參考文獻
[1]王大龍. 基于C#的動態圖形顯示設計與實現探討[J]. 軟件,2013,11:96-97.
[2]周建儒. 基于單繼承的“動態多態性”的分析與應用[J]. 信息技術,2014,03:162-164.
[3]王德超. 程序設計中的動態數組空間分配方法研究[J]. 軟件導刊,2014,04:6-8.
[4]馬瑞敏. OOPC++中的動態多態性及其底層實現機制研究[J]. 長治學院學報,2014,02:54-56.
[5]李文娟,陳曉軒,龔立嬌,陳旭東. 基于動態性能空間的優化控制方法設計[J]. 工程設計學報,2014,05:456-468.
[6]韓翠翠. c#調用c++動態鏈接庫的分析與解決[J]. 民營科技,2013,02:67-68.