第二章 物件導向的程式設計風格(提供預設引數值)

2021-07-02 01:09:54 字數 1336 閱讀 3923

2.3提供預設的引數值

在我們的氣泡排序的程式中,為了將跟蹤資訊列印到ofil,我必須讓我希望加以除錯的函式都能夠使用ofil。我選擇的方法是讓許多函式都能夠看到這個物件:換句話說,我在file scope中定義ofil是乙個不受歡迎的舉動。

一般程式編寫法則是:以「引數傳遞」作為函式間的溝通方式。比「直接將物件定義於file scope」更適當。理由之一是,函式如果過於依賴定義於file scope內的物件,就比較難在其他環境中重用。也比較難以修改。我們不僅需要了解該函式的工作邏輯,也必須了解定義於file scope中的那些物件的工作邏輯。

程式:對bubble_sort()做修改,使他擺脫對file scope內ofil的依賴: }

}雖然這使我們擺脫了對file scope內ofil的依賴,但它也同時也帶來了問題。每次呼叫bubble_sort()都必須傳入乙個ofstream物件,而且使用者無法關閉我們所產生的資訊。我們希望使用者不但不必輸出用的stream,而且有能力把輸出資訊關閉。預設情況下我們不想產生這些資訊。但是我們又希望那些想要看到這些資訊的使用者可以產生它們。甚至指定其輸出檔案。於是:

程式改進:

c++允許我們全部或者部分引數設定預設值。本例中,我們的ofstream指標引數預設值為0:}}

這個bubble_sort()將其第二引數宣告為ofstream物件的乙個pointer而非reference。我們必須做這樣的乙個改變,才可以設定它的預設值為0,表示並未指向任何ofstream物件。reference不同於pointer,無法被設定為0.因此reference一定得代表某個物件。

有了這樣的改變後,當使用者以單一引數呼叫bubble_sort()時,不會產生任何的除錯資訊。如果呼叫時有了第二引數,指向某個ofstream物件,那麼這個函式會產生除錯資訊:程式

int main()

;vectorvec(ia,ia+8);

//以下就像呼叫bubble_sort(vec,0)一樣

//不會產生任何除錯資訊

bubble_sort(vec);

display(vec);

//ok,這樣會產生除錯資訊

ofstream ofil("data.txt");

bubble_sort(vec,&ofil);

display(vec,ofil);

}display()的實現呈現出另一種情況,到目前為止,display()仍將輸出寫死到cout身上。一般情況下輸出到cout當然很好,但是有時候使用者希望提供乙個不同的目的地,例如檔案。我們必須能夠在main()之中同時支援這兩種使用方法。解決之道就是要cout成為預設的ostream引數:

void display(const vector&vec,ostream&os=cout)

第二章 物件導向

1 資料型別 簡單資料型別 byte short int long float double char bool 組合資料型別 struct enum class 值型別 內部資料變化不改變外部資料 struct int float 引用型別 內部資料變化改變外部資料 陣列 指標 class 2 變...

第二章 物件導向設計原則

一 如何衡量軟體設計的質量 內聚度 表示乙個應用程式的單個單元所負責的任務數量和多樣性。內聚與單個類或者單個方法單元相關。好的軟體設計應該做到高內聚。耦合度 耦合度表示類之間關係的緊密程度。低耦合是指盡量使用抽象耦合,少用具體耦合。設計原則名稱設計原則簡介重要性 單一職責原則 的職責要單一,不能將太...

物件導向軟體工程 第二章

首先,實際軟體開發中有很多變數,開發者會犯錯,環境也會改變,客戶也可能犯錯,因此就有各種各樣的模型用以減小變數帶來的損失。1.首先是進化樹模型,它等價與增量 迭代模型,可以理解為最終結果是由不斷新增元件所組成的 增量 而每次新增元件的過程中需要不斷優化,更新元件 迭代 每個增量與迭代都擁有屬於自己的...