c++基礎知識02——函數引用


二.引用

2.1 引用的基本使用

引用的作用:為變量起別名

語法:數據類型 &別名=原名

  1. int a=10 表面上是創建了一個變量,但實質上創建了一塊內存,占4個字節,內容為10,使用變量a來操作這塊內存

引用即為再次創建一個變量名,同時指向與變量a所指的內存,與變量a有同樣的等級,是同塊內存的不同叫法而已

2.注意事項:(1) 引用必須初始化 如int &b就是不合法的,必須要指定b是誰的別名

(2) 引用在初始化后不可改變

int a=10; int c=20;

int &b=a;//聲明b是a的一個別名

int &b=c;//又聲明b是c的一個別名,但不可行,會報錯

2.2引用做函數參數

調用函數傳參數的方式(之前):值傳遞(形參不可修飾實參)和地址傳遞(要想形參修飾實參必須要用地址傳遞,指針)

今天介紹另一種傳參的方式:引用用函數參數

作用:函數傳參時,可以利用引用的技術讓形參修飾實參

優點:可以簡化指針修飾實參

#include<iostream>
using namespace std;
// 交換函數
//1.值傳遞
void myswap01(int a,intb)
{
    int temp=a;
    a=b;//結果是swap01->a=20   awap01->b=10 只是形參發生改變實參並沒有 
    b=temp;
} 
//2.地址傳遞
void myswap01(int *a,int *p)
{
    int temp=*a;//指針來傳遞地址 
    *a=*b;
    *b=temp;
} 
//3.引用傳遞
void myswap03(int &a,int &b)
{
    int temp=a;//調用函數時 &a=a,故swap0->a是實參a的別名,操作同一塊內存 
    a=b;
    b=temp;
} 
int main()
{
    int a=10;
    int b=20;
    myswap01(a,b);//值傳遞,形參不可修飾實參 
    myswap02(&a,&b);
    myswap03(a,b);//通過引用傳參產生的效果同按地址傳遞的結果一樣 
}

2.3 引用做函數的返回值

作用:引用時可以作為函數的返回值存在的

注意:不要返回局部變量

用法:函數調用作為左值

#include<iostream>
using namespace std;
//不要返回局部變量的引用
int &test01()
{
    int a=10;//局部變量存放在棧區
    return a; 
} 
//函數的調用可以作為左值
int &test02()
{
    static int a=10;//靜態變量,存放在全局區,其區上的數據在程序結束后釋放
    return a; 
} 
int main()
{
    int &ref=test01();
    cout<<ref<<endl;
    cout<<ref<<endl;//第一次結果是正確的,是因為編譯器做了保存,而第二次就是隨機數了,因為局部變量的內存在函數調用完成后已經釋放
    
    int &ref2=test02();//等號左邊是左值,test02是a的別名,而ref2又是test02的別名,所以ref02也是a的別名
     cout<<ref<<endl;
     cout<<ref<<endl;
     return 0;//如果函數的返回值是引用,這個函式調用可以作為左值 
}

2.4 引用的本質

本質:在c++內部實現是一個指針變量

#include<iostream>
using namespace std;
void func(int &ref)//編譯器發現是引用時,轉換成int *const ref=&a; 
{
    ref=100;//ref是引用,轉換成*ref=100 
} 
int main()
{
    int a=10;
    int &ref=a;//自動轉換成int *const ref=&a 指針常量是指針指向不可改,也說明為什么 引用不可更改
    ref=20;
    cout<<ref<<endl;
    cout<<a<<endl;
    func(a);
    cout<<ref<<endl;
    cout<<a<<endl;
    return 0; 
}

2.5 常量引用

常量引用主要用靠修飾形參,防止誤操作,在函數形參列表中可以加const修飾形參防止形參改變實參

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM