網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
解釋引用
首先我們先來(lái)看一個(gè)引用的例子
int main()
{
int a = 10;
int& Bin = a;
cout << a << endl;
cout << Bin << endl;
cout << &a << endl;
cout << &Bin << endl;
}
對(duì)于一個(gè)int型函數(shù)a,我們對(duì)a進(jìn)行了引用,引用的新int函數(shù)叫Bin。
由他們是同一個(gè)地址可以知道,引用其實(shí)就是對(duì)同一個(gè)地址的函數(shù),換了一個(gè)新的叫法。
相當(dāng)于《水滸傳》中,李逵在江湖上人稱黑旋風(fēng)
那么這里int a就相當(dāng)于李逵,而int&Bin就相當(dāng)于黑旋風(fēng)。
你使用李逵和黑旋風(fēng),他都會(huì)答應(yīng),這也就相當(dāng)于起外號(hào)
如下:
int main()
{
int a = 10;
int& Bin = a;
Bin += 10;
cout << a << endl;
cout << Bin << endl;
cout << &a << endl;
cout << &Bin << endl;
}
可以看到我們這里是對(duì)Bin進(jìn)行操作,但是a的值也改變了。
同時(shí)我們也可以多個(gè)引用,可以給引用再引用(給外號(hào)再起外號(hào))
int main()
{
int a = 10;
int& Bin = a;
int& Tian = a;
int& Wei = Bin;
cout << a << endl;
cout << Bin << endl;
cout << Tian << endl;
cout << Wei << endl;
cout << &a << endl;
cout << &Bin << endl;
cout << &Tian << endl;
cout << &Wei << endl;
}
可以看到值和地址還是相同。
注意:引用必須同等類型
int a=10;
double&b=a;
這是錯(cuò)誤的
引用的作用
非常經(jīng)典的引用就是交換兩個(gè)數(shù)的值。
這是我們c語(yǔ)言的交換,這里形參不改變實(shí)參
void test1(int a,int b)//a,b不改變,因?yàn)閍,b的生命周期只在swap函數(shù)內(nèi),結(jié)束swap后a,b就消失,不改變實(shí)參
{
int tmp = a;
a = b;
b = tmp;
}
int main()
{
int a = 1;
int b = 2;
test1(a, b);
cout << a << " " << b << endl;
}
然后我們學(xué)習(xí)了指針后,知道能直接交換地址
void test2(int* a, int *b)//使用指針,交換地址實(shí)現(xiàn)數(shù)字變換
{
int tmp = *a;
*a = *b;
*b = tmp;
}
int main()
{
int a = 1;
int b = 2;
test2(&a,&b);
cout << a << " " << b << endl;
}
然后這是引用,引用是實(shí)參的外號(hào),我們這里修改,是對(duì)實(shí)參的直接修改
void test3(int& a, int& b)//使用引用,a,b是實(shí)參的別名,相當(dāng)于對(duì)實(shí)參的調(diào)用
{
int tmp = a;
a = b;
b = tmp;
}
int main()
{
int a = 1;
int b = 2;
test3(a, b);
cout << a << " " << b << endl;
}
注意:我們這里的引用都必須是合法的空間
Int &a = 10;//10并不是一個(gè)空間,只是一個(gè)數(shù),這是錯(cuò)誤的引用
關(guān)于局部變量的引用
int& test2()
{
int b = 10;
return b;
}
void test1()
{
int &a = test2();
cout << a << endl;
}
int main()
{
test1();
}
按照常理,這里test2中的b出了test2應(yīng)該作為局部變量被回收,但是
我們依然能得到正確答案,這是因?yàn)榫幾g器有對(duì)這種情況進(jìn)行優(yōu)化,但是僅限一次
如果我們這樣
int& test2()
{
int b = 10;
return b;
}
void test1()
{
int& a = test2();
cout << a << endl;
cout << a << endl;
cout << a << endl;
cout << a << endl;
}
int main()
{
test1();
}
多調(diào)用幾次打印
就會(huì)發(fā)現(xiàn)除了第一次是正常的,其余都是亂碼。
注:如果實(shí)在是要這樣搞,就加上靜態(tài)變量Static。
int& test2()
{
static int b = 10;
return b;
}
void test1()
{
int& a = test2();
cout << a << endl;
cout << a << endl;
cout << a << endl;
cout << a << endl;
}
int main()
{
test1();
}
原文鏈接:https://blog.csdn.net/qq_62718027/article/details/124561766
相關(guān)推薦
- 2022-03-26 oracle自動(dòng)統(tǒng)計(jì)信息時(shí)間的修改過(guò)程記錄_oracle
- 2022-07-15 Android?Camera開發(fā)實(shí)現(xiàn)可復(fù)用的相機(jī)組件_Android
- 2023-11-22 Linux fatal: unable to access ‘https://github xxxx
- 2023-04-01 SqlServer字符截取的具體函數(shù)使用_MsSql
- 2023-04-08 C#字符串和Acsii碼相互轉(zhuǎn)換_C#教程
- 2022-09-22 SGL:Self-supervised Graph Learning for Recommendat
- 2023-04-06 C#?Csv實(shí)現(xiàn)基本的讀寫和轉(zhuǎn)換DataTable_C#教程
- 2022-07-15 Python?print函數(shù):如何將對(duì)象打印輸出_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支