實參
-
實際的參數,即在生命週期內的,可以說其實實參就是形參,因爲每一個參數都都是在一個函數內定義的(全局變量,static除外)
-
實參出現在主調函數中,進入被調函數後,實參變量也不能使用。
形參
-
形式上的參數,由傳入的實參進行初始化,生命週期在函數的調用後結束;形參和實參的功能是作數據傳送。發生函數調用時, 主調函數把實參的值傳送給被調函數的形參從而實現主調函數向被調函數的數據傳送。
1.傳遞的形式;
傳引用;即將形參綁定到傳入的實參對象上儘量使用引用而非拷貝(拷貝大的類型或者容器對象低效) 若無需修改引用的實參,最好使用常量引用
bool is_shorter(const string &str1,const string & str2){
rerturn str1.size()>str2.size();
}傳值; 傳遞的是實參的一個拷貝
- 指針形參
若形參前無&,則爲指針形參,即是傳值;實際上是這樣的,傳引用,系統將在函數棧,上開闢一塊內存,用於存儲指針,該指針指向了實參,所以修改這個指針所指向的對象會改變到實參;而傳值不同,傳值是把實參拷貝一份,所以形參和實參將是兩個東西,互不影響!
附:
1.深拷貝:指的就是當拷貝對象中有對其他資源(如堆、文件、系統等)的引用時(引用可以是指針或引用)時,對象的另開闢一塊新的資源,而不再對拷貝對象中有對其他資源的引用的指針或引用進行單純的賦值。
2.淺拷貝:將指向對象的內存拷貝一份,因而與對象仍然有關聯,此時應該注意指針空懸的問題
總結
- 形參變量只有在被調用時才分配內存單元,在調用結束時, 即刻釋放所分配的內存單元。因此,形參只有在函數內部有效。 函數調用結束返回主調函數後則不能再使用該形參變量。
- 實參可以是常量、變量、表達式、函數等, 無論實參是何種類型的量,在進行函數調用時,它們都必須具有確定的值, 以便把這些值傳送給形參。 因此應預先用賦值,輸入等辦法使實參獲得確定值。
- 實參和形參在數量上,類型上,順序上應嚴格一致, 否則會發生“類型不匹配”的錯誤。
- 函數調用中發生的數據傳送是單向的。 即只能把實參的值傳送給形參,而不能把形參的值反向地傳送給實參。 因此在函數調用過程中,形參的值發生改變,而實參中的值不會變化。
- 當形參和實參不是指針類型時,在該函數運行時,形參和實參是不同的變量,他們在內存中位於不同的位置,形參將實參的內容複製一份,在該函數運行結束的時候形參被釋放,而實參內容不會改變。
而如果函數的參數是指針類型變量,在調用該函數的過程中,傳給函數的是實參的地址,在函數體內部使用的也是實參的地址,即使用的就是實參本身。所以在函數體內部可以改變實參的值。