天天看點

《C++面向對象高效程式設計(第2版)》——3.14 為參數選擇正确的模式

本節書摘來自異步社群出版社《c++面向對象高效程式設計(第2版)》一書中的第3章,第3.14節,作者: 【美】kayshav dattatri,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。

c++面向對象高效程式設計(第2版)

盡可能避免按值傳遞大型對象。對于基本類型和小型對象,可按值傳遞。複制對象的開銷很大,但是,如果主要考慮安全問題,則應堅持按值傳遞。

需要傳遞對象時,不要傳遞指針。

`

void f (t* object);`

(1)指針無法保證它确實指向某對象,它很可能是一個空指針。

(2)如果被調函數需要将真正的對象作為參數,則傳遞引用,而不是指針。這可確定不出現問題,被調函數無需檢查空引用(因為不可能出現這種情況)。

(3)如果希望被調函數在對象中寫入(輸出形參),則傳遞引用,但不是對const的引用。

(4)傳遞引用并不意味着将對象的所有權移交給被調函數。主調函數仍然擁有對象(且對其負責)以及與該對象相關的記憶體。如果被調函數希望主調函數放棄對象的所有權,應在文檔中清楚地說明。否則,雙重删除(<code>double delete</code>)會導緻程式無法正常運作。[多次釋放(在c++中為<code>delete</code>,c中為<code>free</code>)一個指針所指向的動态記憶體位址時,會發生雙重删除。使用<code>new()</code>配置設定的記憶體隻能使用delete操作符删除一次。但是有時,由于程式出錯,相同的指針會被多次删除。]

(5)被調函數需要檢查指針是否為空,才能使用它。這樣的接口非常不好用,而且難以追蹤。如果确實需要,應在文檔中清楚地說明,以免混淆。

當傳遞基本類型參數時,要堅持使用值參數(<code>value argument</code>)。傳遞指針和傳遞整數的開銷一樣,但是,按值傳遞更安全。

在可以使用預設值參數的地方,盡可能使用預設值參數。它們不僅包含更多資訊,還有助于了解參數的用途和減少了客戶的負擔。客戶隻需傳遞較少的參數。

盡量對參數和函數使用const限定符。前面介紹過,編譯器能識别const限定符,這樣做讓編譯器也參與其中,使得程式更加強健穩定。

如果希望在參數中使用多态(後續章節将介紹),則必須使用引用或指針參數,不能使用按值傳遞。此規則也适用于傳回值(在下面說明)。

注意:

無論何種規則,都有一些例外,特别是将指向基本類型的指針作為參數時。即使不涉及轉移所有權,也應按照慣例,傳遞指向基本類型(特别是字元指針,<code>char*</code>)的指針。這是因為指針允許導航(使用++和--操作符),而引用并沒有這種靈活性。在大多數情況下,這樣的指針都用來作輸出和輸入/輸出形參(參見<code>strcpy</code>、<code>strcat</code>等庫函數)。如果在接口中發現使用未轉移所有權的普通指針時,不要感到驚訝。不過,這樣的接口必須在文檔中詳細地說明。由于指針的靈活性,甚至當傳遞未轉移所有權的對象時,在某些情況下也要使用指向這些對象的指針,而不是引用。方法可以要求指向對象的指針參數,但要帶有預設值null,這允許主調函數在調用方法時可省略參數。在這種情況下,指針将用于指出哪個參數是可選的,而引用參數卻很難做到這一點,因為它沒有獨特的值來區分非法引用(每個引用都是合法的引用)。是以,要養成遵循一些規則,但同時也記住例外的好習慣。無論如何,都要在文檔中清楚說明這樣的接口,以避免出現混淆。

本文僅用于學習和交流目的,不代表異步社群觀點。非商業轉載請注明作譯者、出處,并保留本文的原始連結。

繼續閱讀