C 再學習系列 指標和引用

2021-09-06 01:43:52 字數 1143 閱讀 2897

原題目:使用合理的引用引數實現介面的自說明

在引用和指標的小文中,主要討論了引用和指標語法層面上的區別。本文將側重如何更加合理地利用語言對引用所作限制。

在c++中,指標是最靈活的,也是最危險的。在程式設計當中,可使用const對指標做限制。

const type * var;            //var指標變數指向乙個const type的物件,因為物件做了const限制,故該指標只能呼叫type類中,帶const限制的介面。最佳情況下,該指標不會改變type物件的內部狀態。

const type * const var;  //var指標變數指向乙個const type的物件,同上,最佳情況下,該指標不會改變type物件的內部狀態。 另外指標的型別為const指標,也就是該指標變數並不能重新賦值(同引用)。

那麼現在有個問題:呼叫type的析構函式算不算改變type物件的狀態?

個人理解,析構乙個物件肯定是改變該物件的狀態。那麼如果說const限制意味著不能改變物件狀態,那麼編譯器理應對delete 指向const type的物件操作報錯。不過編譯器並沒有這麼做。為什麼?假設編譯器限制析構const type的物件,由於析構函式本身的特殊性,這將導致所有的const type物件都無法析構。這是極其不合理。因此,不管指標做什麼樣的限制,都無法限制呼叫者直接delete 指標所指向的物件。注:thinkingfor的解釋:const與物件的構造與析造無關。

那麼如果使用const引用能否限制使用者的不合理行為嗎?這是可以的。引用本身僅僅是變數的別名,並不控制物件的生存期。對於非const的引用,使用者可以方便地改變引用物件的狀態;如果想讓使用者無法改變引用物件的狀態,只要加上const限制即可。

區別了const引用和非const引用之後,很容易想到,將傳入引數宣告為const引用,將傳出的引數宣告為非const引用。另外,程式中還經常使用函式返回值來傳遞物件的內部變數。同樣的道理,我們也可以通過將返回值限制為const引用來限制使用者不小心改變物件的內部狀態。對於const的返回值,如果使用者需要改變物件狀態,那麼可以通過拷貝建構函式來初始化乙個新物件。也就是說,const返回值可以強制使用者使用新的物件拷貝,從而避免易錯的物件clone。

當然,如果使用引用來傳遞引數,為了易用性,應該編寫拷貝建構函式和過載賦值運算子。

兄弟的公司:立即購--手機購物,誠信網購

C 再學習系列 ADL Koenig 查詢

adl koenig 查詢 adl,引數相關查詢,也稱作為 koenig 查詢 以 andrew koenig 的名字命名 是指在編譯器對無限定域的函式呼叫進行名字查詢時,所應用的一種查詢規則。首先來看乙個函式所在的域的分類 1 類域 函式作為某個類的成員函式 靜態或非靜態 2 名字空間域 3 全域...

c 學習筆記 指標和引用

指標和引用的區別 1 引用是乙個變數的別名,本身不單獨分配自己的記憶體空間,跟原來變數共享記憶體空間 而指標需要重新分配自己的記憶體空間,用來儲存指向物件的位址。2 引用訪問乙個變數是直接訪問,而指標是間接訪問。3 引用一經初始化就繫結到乙個記憶體空間,且只能是這個記憶體空間的名字,定義時必須初始化...

C 再學習系列 前置 與後置

前置 type operator 後置 const type operator int 為了編譯器區分前置和後置 c 規定字尾形式有乙個int型別引數 當函式被呼叫時,編譯器傳遞乙個0做為int引數的值給該函式。不這樣規定,無法區分,因為都僅以自身物件為入參。下面是乙個簡單的例子 上面的實現解釋了乙...