【Data】数据结构之C++程序设计(1)
生活随笔
收集整理的這篇文章主要介紹了
【Data】数据结构之C++程序设计(1)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、函數與參數
1、傳值參數:
?
template<class T>T Abc(T a, T b, T c){return a+b+b*c+(a+b-c)/(a+b)+4;}
?
?
假定a,b,c是傳值參數,在函數被調用時,類型T(T可以是int,float等或自定義類型)的復制構造函數把相應的實際參數分別復制到形式參數a,b,c之中,以供函數使用;而在函數返回時,類型T的析構函數會被喚醒,以便釋放形式參數a,b,c.缺點:大量傳值開銷大 例如: ?假定數據類型為用戶自定義的 M a t r i x,那么它的復制構造函數將負責復制其所有元素,而析構函數則負責逐個釋放每個元素(假定 Matrix 已經定義了操作符+,*和 /) 。如果我們用具有1 0 0 0個元素的Matrix 作為實際參數來調用函數 A b c,那么復制個實際參數給 a,b 和c將需要3 0 0 0次操作。當函數A b c返回時,其析構函數又需要花費額外的 3 0 0 0次操作來釋放a,b和c。
2、引用參數
template<class T>T Abc(T& a, T& b, T& c){return a+b+b*c+(a+b-c)/(a+b)+4;} 在上面的代碼中, a,b 和c 是引用參數( reference parameter) 。如果用語句Abc (x, y, z) 來調用函數A b c,其中x、y 和z 是相同的數據類型,那么這些實際參數將被分別賦予名稱a,b 和c,因此,在函數Abc 執行期間,x、y 和z 被用來替換對應的a,b 和c。與傳值參數的情況不同,在函數被調用時,本程序并沒有復制實際參數的值,在函數返回時也沒有調用析構函數。
我們可以考察一下當a,b 和c 所對應的實際參數x,y 和z 分別是具有1 0 0 0個元素的矩陣時 的情形。由于不需要把x,y 和z 的值復制給對應的形式參數,因此我們可以節省采用傳值參數
進行參數復制時所需要的3 0 0 0次操作。 ###(注意這里只是節省了復制構造函數的3000次操作,而沒有節省析構函數的3000次操作)###
3、常量引用參數
template<class T>T Abc(const T& a, const T& b, const T& c){return a+b+b*c+(a+b-c)/(a+b)+4;} 使用關鍵字const 來指明函數不可以修改引用參數的值,這在軟件工程方面具有重要的意義。這將立即告訴用戶該函數并不會修改實際參數。 對于諸如i n t、float 和char 的簡單數據類型,當函數不會修改實際參數值的時候我們可以采用傳值參數; 對于所有其他的數據類型(包括模板類型) ,當函數不會修改實際參數值的時候可以采用常量引用參數。 ###(為什么這樣呢?)###
4、返回值 函數可以返回值,引用或常量引用。在前面的例子中,函數 Abc 返回的都是一個具體值, 在這種情況下,被返回的對象均被復制到調用(或返回)環境中。對于函數 Abc 的所有版本來說這種復制過程都是必要的,因為函數所計算出的表達式的結果被存儲在一個局部臨時變量中,當函數返回時,這個臨時變量(以及所有其他的臨時變量和傳值形式參數)所占用的空間將被釋放,其值當然也不再有效。為了避免丟失這個值,在釋放臨時變量以及傳值形式參數的空間之前,必須把這個值從臨時變量復制到調用該函數的環境中去。 如果需要返回一個引用,可以為返回類型添加一個前綴&。如:
T& X(int i, T& z)
定義了一個函數X,它返回一個引用參數Z。可以使用下面的語句返回z:
return z;
這種返回形式不會把z 的值復制到返回環境中。當函數X返回時,傳值形式參數i 以及所有局部變量所占用的空間都將被釋放。由于z 是對一個實際參數的引用,因此,它不會受影響。如果在函數名之前添加關鍵字c o n s t,那么函數將返回一個常量引用,例如:
const T& X (int i, T& z)
除了返回的結果是一個不變化的對象之外,返回一個常量引用與返回一個引用是相同的。
轉載于:https://www.cnblogs.com/claire-study-note/archive/2013/04/19/3065505.html
總結
以上是生活随笔為你收集整理的【Data】数据结构之C++程序设计(1)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: cocos 射线检测 3D物体 (Spr
- 下一篇: uwsgi: invalid optio