C++中引用處理的基本方法
1.引用的基本用法
引用是C++對(duì)C的重要擴(kuò)充。在c/c++中,指針用法基本一致。但是C++增加了另一種給函數(shù)傳遞地址的途徑,這就是引用傳遞,也存在去其他語言,并不會(huì)是C++獨(dú)有。
1.1 引用的實(shí)質(zhì)
原類型 &別名 = 舊名
1.2 引用的用法
注意事項(xiàng):
引用一旦初始化,不能更改引用的指向
引用定義時(shí)必須初始化 不能引用NULL
引用可以引用任意類型包括數(shù)組
&在等號(hào)的左邊是引用,在等號(hào)的右邊是取地址
代碼
#include <iostream>
using namespace std;
void test01()
{
int a = 10;
int& b = a;
b = 100;
cout << a << endl;
int c = 1;
//b = c; 代表把c的值賦值給b 不是給c取別名為b
//int &d; 引用定義時(shí)必須初始化
}
void test02()
{
int a[5] = { 1,2,3,4,5 };//int(&arr)[5] = a;
typedef int ARR[5]; //type & 別名 = 舊名
ARR & arr = a;
for (int i = 0; i < 5; i++)
{
cout << arr[i] << " ";
}
cout << endl;
}
int main()
{
test02();
return 0;
}2.函數(shù)中的引用
引用可以作為函數(shù)的形參 ,不能返回局部變量的引用
在C語言中我們記得我們可以用指針解決函數(shù)不能交換值的問題。
swap(int *x ,int *y)
{
int temp = *x;
*x = *y;
*y = temp;
}
void test01()
{
int a = 10;
int b = 20;
swap(&a,&b);
} 在C++中可以也使用引用很好的解決這個(gè)問題
void swap_ref(int &x, int &y)// int &x =a, int &y =b
{
int tmp = x;
x = y;
y = tmp;
}
void test01_ref()
{
int a = 10;
int b = 20;
swap_ref(a, b);
}如果想開辟數(shù)組地址,用指針的做法是
//形參是指針 引用
void get_mem(int **q)
{
*q = (int *)malloc(5 * sizeof(int));
}
void test03()
{
int *p = NULL;
get_mem(&p);
get_mem_ref(p);
}用引用可以這樣做
void get_mem_ref(int * &q)//int * (&q) = p
{
q = (int *)malloc(5 * sizeof(int));
}
void test03()
{
int *p = NULL;
get_mem(&p);
get_mem_ref(p);
}能不能返回一個(gè)變量的引用 看這個(gè)變量的空間是否被釋放了
int & test04()
{
//能不能返回一個(gè)變量的引用 看這個(gè)變量的空間是否被釋放了
static int b = 100;
int a = 10;
//return a;//err 不能返回局部變量的引用
return b;//可以返回靜態(tài)的變量的引用
}3.引用的本質(zhì)
引用的本質(zhì)是一個(gè)指針常量
type &b = a; 編譯器底層這么實(shí)現(xiàn)的: type *const b = &a
比如你寫
int &b = a; // 編譯器優(yōu)化為 int * const b = &a
4.指針的引用
套用引用公式: type &q = p
如果想改變p的內(nèi)容,函數(shù)傳遞的時(shí)候按照指針的方法傳的是地址,如下: get_mem(&p);
如果你想用引用的方法直接傳就行
void test03()
{
? int *p = NULL;
? get_mem(&p);
? get_mem_ref(p);
}5.常量引用
const type &p = q;
常量引用代表不能通過引用去修改引用標(biāo)識(shí)的那塊空間
int a = 10; const int &b = a;
如果你再去 讓 b = 1000;就是錯(cuò)誤的
雖然不能引用常量,但是可以加const來引用
int &b = 100; //不能引用常量
改為
const int &b = 1;
原理上是 等價(jià)于,相當(dāng)于讓tmp = 1
int tmp =1 ,const int &b= tmp;
補(bǔ)充:引用和指針的區(qū)別(重要)
從底層匯編的角度來說,引用和指針是沒有區(qū)別的,都是以存地址的方式實(shí)現(xiàn)的(了解即可)
不同點(diǎn):
- 引用概念上是定義一個(gè)變量的別名,指針是存儲(chǔ)一個(gè)變量地址。
- 引用定義的時(shí)候必須初始化,而指針沒有要求。
- 引用在初始化一個(gè)實(shí)體后,就不能再引用其他實(shí)體,但指針可以在任何時(shí)候指向任何一個(gè)同類型的實(shí)體。
- 沒有NULL引用,但有NULL指針。
- 引用比指針使用起來更安全
- 再sizeof中含義不同:引用結(jié)果為引用類型的大小,但指針始終是地址空間所占字節(jié)個(gè)數(shù)(32位平臺(tái)下是4)
- 引用自加即引用的實(shí)體增加1,指針自加即指針向后偏移一個(gè)類型的大小。
- 有多級(jí)指針,但沒有多級(jí)引用
- 訪問實(shí)體方式不同,指針需要解引用,引用的話編譯器會(huì)自己處理。
總結(jié)
到此這篇關(guān)于C++中引用處理的文章就介紹到這了,更多相關(guān)C++引用處理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語言實(shí)現(xiàn)航班售票系統(tǒng) C語言實(shí)現(xiàn)航班管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)航班售票系統(tǒng),C語言實(shí)現(xiàn)航班管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-12-12
C++ 將一個(gè)文件讀入數(shù)組再讀出數(shù)組的方法
今天小編就為大家分享一篇C++ 將一個(gè)文件讀入數(shù)組再讀出數(shù)組的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-07-07
C語言深入分析數(shù)組指針和指針數(shù)組的應(yīng)用
在C語言和C++等語言中,數(shù)組元素全為指針變量的數(shù)組稱為指針數(shù)組,指針數(shù)組中的元素都必須具有相同的存儲(chǔ)類型、指向相同數(shù)據(jù)類型的指針變量。指針數(shù)組比較適合用來指向若干個(gè)字符串,使字符串處理更加方便、靈活2022-04-04
c語言實(shí)現(xiàn)數(shù)組循環(huán)左移m位
這篇文章主要介紹了c語言實(shí)現(xiàn)數(shù)組循環(huán)左移m位,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07
Visual Studio Community 2022(VS2022)安裝圖文方法
這篇文章主要介紹了Visual Studio Community 2022(VS2022)安裝方法,本文分步驟通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-09-09
關(guān)于vector迭代器失效的幾種情況總結(jié)
下面小編就為大家?guī)硪黄P(guān)于vector迭代器失效的幾種情況總結(jié)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-12-12
使用C++構(gòu)建一個(gè)優(yōu)先級(jí)隊(duì)列的實(shí)現(xiàn)
優(yōu)先級(jí)隊(duì)列是一種特殊的隊(duì)列數(shù)據(jù)結(jié)構(gòu),本文主要介紹了使用C++構(gòu)建一個(gè)優(yōu)先級(jí)隊(duì)列的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-02-02

