C++學習筆記(二)——交換函數(swap)

此次咱們要透過一個簡單的函數swap深刻理解函數傳參的本質以及在C++中如何選擇傳參方式。程序員

先來看第一段程序:函數

void swap(int x, int y) {
    int temp = y;
    y = x;
    x = temp;
}

經過main函數的調用,咱們發現x,y並未實現交換:學習

int main()
{
    int x = 1;
    int y = 37;

    swap(x, y);

    cout << x << ":" << y << endl;
    return 0;
}

緣由是整形x和y在函數swap內爲按值傳遞,按值傳遞時,函數不會訪問當前調用的實參。函數處理的值是它本地的拷貝,這些拷貝被存儲在運行棧中,所以改變這些值不會影響實參的值。一旦函數結束了,函數的活動記錄將從棧中彈出,這些局部值也就消失了。spa

在按值傳遞的狀況下,實參的內容沒有被改變。這意味着程序員在函數調用時無需保存和恢復實參的值。若是沒有按值傳遞機制,那麼每一個沒有被聲明爲const 的參數就可能會隨每次函數調用而被改變。按值傳遞的危害最小,須要用戶作的工做也最少。毫無疑問,按值傳遞是參數傳遞合理的缺省機制。3d

另外,若是做爲實參的變量是一個大型類的對象,分配並拷貝到棧中的時間和空間開銷每每過大。指針

要實現swap函數的效果,咱們應如何處理呢?第一個可行的作法是將形參聲明成指針:code

void pswap(int *x, int *y) {
    int temp = *y;
    *y = *x;
    *x = temp;
}

 

在pswap函數中,因爲傳遞的是兩個變量的內存地址(指針)使得咱們能夠直接操做對應的值。實際上這裏仍是存在按值傳遞的問題,只是由原先的整形傳遞變成了指針傳遞。咱們能夠修改指針指向的內存卻依然沒法修改指針自己。第二個可行的作法是想形參聲明爲指針的引用:對象

void prswap(int *&x, int *&y) {
    int temp = *y;
    *y = *x;
    *x = temp;
}

void prswap(int *&x, int *&y) {
    int *temp = y;
    y = x;
    x = temp;
}

 

請注意,同一個函數原型下我提供了兩種函數定義。可不管哪種,在實參傳遞的階段都不會發生按值傳遞的問題。那麼兩種定義到底哪種更知足咱們需求:blog

(1)交換內存中的值內存

(2)交換指針地址

若是單獨考慮本文的需求,第一種方法更知足。可是,若是咱們須要交換的是一個大型類對象,第二種的效率則更高。

總結:內存管理是C++學習的一個難點,初學者每每不容易掌握。但越是如此就越能體現一個開發者的語言內功。

相關文章
相關標籤/搜索