1. 程式人生 > 其它 >c++從入門到精通,引用相關介紹

c++從入門到精通,引用相關介紹

引用的實質及應用

很多剛入門c++的計算機小白,在面露難色學完指標後再接觸C++中的引用。就會有一種十分舒適的感覺。在c++中引用無論如何都是在某些方面替代指標的容易上手的工具。引用通俗一點就是別名,而指標是涉及計算機底層記憶體的地址。當然既然是工具我們就得深入瞭解引用。引用的實質還是指標常量,只不過更加“平易近人”

引用的實質

首先讓我們複習以下***指標常量***

指標常量特點:指標的指向不可以修改,但是指標指向的值可以修改,後面兩字可修改

#include<iostream>
using namespace std;
int main() {
	int a = 10;
	int b = 10;
	int* p = &a;//定義一個指標p指向a的地址。
//指標常量特點:指標的指向不可以修改,但是指標指向的值可以修改,
	int* const p2 = &a;//定義一個指標常量p2指向a的地址。
	//p2 = &b  //錯誤,因為指標指向不可修改
	*p2 = 20;  //正確,指標指向的值可以修改。
	system("pause");
	return 0;
}

這裡就不畫記憶體條詳細解釋了。>_<

引用的注意事項

根據指標常量的特點:

  • 引用必須初始化

  • 引用一旦初始化以後便不可修改

a = 10;
b = 20;
int &c = a; //這就是將引用c初始化。
//int &c    錯誤
c = b 
/*!!!!這並不是更改引用,而是賦值操作。
即a及a的別名c均重新變成了20*/

結合指標常量這也是非常好理解的。(也許你並不想提這幾個字)@- _ @-。

引用的相關用法

  1. 引用作函式引數

可以實現指標傳遞的功能並代替指標。我們知道引用的實質,但在我們用的時候。我們只需要考慮這就是個別名

#include<iostream>
using namespace
std; //值傳遞。只可改變形式引數,不可改變實參。 void hanshu_1(int a, int b){ int temp = a; a = b; b = temp; } //地址傳遞。可改變實參。 void hanshu_2(int* a, int* b){ int temp = *a; *a = *b; *b = temp; } //引用傳遞。也可改變實參,更加通俗易懂。 void hanshu_3(int &a, int &b){ int temp = a; a = b; b = temp; } int main(){ int a = 10; int b = 20; //值傳遞 hanshu_1(a,b); cout<<"a與b的值是"<<a<<";"<<b<<endl;//不會交換 //地址傳遞 hanshu_2(&a,&b); cout<<"a與b的值是"<<a<<";"<<b<<endl;//會交換 //引用傳遞 hanshu_3(a,b); cout<<"a與b的值是"<<a<<";"<<b<<endl;//會交換 }

引用作函式返回值

  1. 不要返回區域性變數的引用。
#include<iostream>
using namespace std;
int& hanshu(){
    int a = 10;
    return a
}
int main(){
    int &test = hanshu();
    cout << test << endl;//第一次返回系統會預設幫你儲存區域性變數a的值
    cout << test << endl;//棧區中的a已被釋放,不會返回  10
}

上面的函式有問題。具體可自己嘗試。

棧區的基部概念:

棧區資料由編譯器管理開闢與釋放:

注意!不要在函式中返回區域性變數的地址。因為區域性變數存放在棧區,資料在函式執行完後會自動釋放。

  1. 函式的呼叫可作為左值
#include<iostream>
using namespace std;
int& hanshu(){
    static int a = 10;//靜態變數存放在堆區。
    return a
}
int main(){
   int &test = hanshu();
   hanshu() = 1000;//左值即在等號的左邊
/*此時a與test均變為1000
   因為返回的是引用,就相當於a賦值為1000!
*/       
}

常量引用

  • 加上const修飾形成防止誤操作使實參改變。

!!!以防萬一,將來如果出錯,在上萬行程式碼中找bug很恐怖@-_@-

void hanshu_1(const int& a){
    cout<<a<<endl;
}
  • 可實現優化程式碼

因為引用本身需要一個合法的記憶體空間。結合指標不可以對一個沒有指向的指標所指向的量進行賦值。

int &a = 10;//錯誤,因為引用本身需要一個合法的記憶體空間。

但是下面的可行。更簡潔因為編譯器幫我們作了相應的處理使其合法。

即幫我們建立了一個臨時變數來儲存10,再引用。

const int &a = 10;

關於引用就總結這麼多了,謝謝大家閱讀。
推薦自學C++的課程,嗶哩嗶哩up黑馬程式設計師,個人感覺課程十分nice
點選這裡



本文來自部落格園,作者:litecdows,作者在其他部落格平臺均使用此暱稱!
轉載請註明原文連結:https://www.cnblogs.com/litecdows/p/15864400.html