1. 程式人生 > >const常引用(const + &)避免函式引數的雙向傳遞

const常引用(const + &)避免函式引數的雙向傳遞

在c++可以使用引用傳遞作為函式的形參傳入函式,相較於值傳遞的方式,引用傳遞能夠節省函式使用時的記憶體分配,不需要像值傳遞一樣拷貝實參。對於普通的資料型別可能看出引用的優勢,但是如果函式的傳入引數是一個十分複雜的結構體或者類,那麼引用傳遞可以節省很大的記憶體開銷。

然而,由於引用傳遞是雙向的,當在函式中對於形參的資料進行改變後,實參的值也會進行相應的改變,如下所示:

#include <iostream>
using namespace std;

struct Point
{
    int x;
    int y;
    
    Point(int a, int b)
    {
	x=a;
	y=b;
    }
};

void fun(Point& point);

int main()
{
    Point point(1,1);
    fun(point);
    point.x++;
    point.y++;
    cout << "======main======" << endl;
    cout << "點的座標為(" << point.x << "." << point.y << ")" << endl;
    return 0;
}


void fun(Point& point)
{
    point.x++;
    point.y++;
    cout << "======fun======" << endl;
    cout << "點的座標為(" << point.x << "," << point.y << ")" << endl;
}

執行結果如圖,可以看出來函式將引用傳入的值改變了 在這裡插入圖片描述

如果我們既不想改變傳入引數的值,也不想因為值傳遞產生太大的開銷,那麼可以嘗試一下使用常引用。

void fun(const Point& point)
{
    point.x++;
    point.y++;
    cout << "======fun======" << endl;
    cout << "點的座標為(" << point.x << "," << point.y << ")" << endl;
}

如圖,如果我們將程式碼改成這樣,可以發現編譯無法成功,編譯器會報錯: 在這裡插入圖片描述

可見,使用了常引用之後,傳入引數的值就是一個常量了,無法對其內部變數進行修改,保證了傳入引數的資料安全性。