網(wǎng)站首頁 編程語言 正文
解釋引用
首先我們先來看一個引用的例子
int main()
{
int a = 10;
int& Bin = a;
cout << a << endl;
cout << Bin << endl;
cout << &a << endl;
cout << &Bin << endl;
}
對于一個int型函數(shù)a,我們對a進行了引用,引用的新int函數(shù)叫Bin。
由他們是同一個地址可以知道,引用其實就是對同一個地址的函數(shù),換了一個新的叫法。
相當于《水滸傳》中,李逵在江湖上人稱黑旋風
那么這里int a就相當于李逵,而int&Bin就相當于黑旋風。
你使用李逵和黑旋風,他都會答應,這也就相當于起外號
如下:
int main()
{
int a = 10;
int& Bin = a;
Bin += 10;
cout << a << endl;
cout << Bin << endl;
cout << &a << endl;
cout << &Bin << endl;
}
可以看到我們這里是對Bin進行操作,但是a的值也改變了。
同時我們也可以多個引用,可以給引用再引用(給外號再起外號)
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;
這是錯誤的
引用的作用
非常經(jīng)典的引用就是交換兩個數(shù)的值。
這是我們c語言的交換,這里形參不改變實參
void test1(int a,int b)//a,b不改變,因為a,b的生命周期只在swap函數(shù)內,結束swap后a,b就消失,不改變實參
{
int tmp = a;
a = b;
b = tmp;
}
int main()
{
int a = 1;
int b = 2;
test1(a, b);
cout << a << " " << b << endl;
}
然后我們學習了指針后,知道能直接交換地址
void test2(int* a, int *b)//使用指針,交換地址實現(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;
}
然后這是引用,引用是實參的外號,我們這里修改,是對實參的直接修改
void test3(int& a, int& b)//使用引用,a,b是實參的別名,相當于對實參的調用
{
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并不是一個空間,只是一個數(shù),這是錯誤的引用
關于局部變量的引用
int& test2()
{
int b = 10;
return b;
}
void test1()
{
int &a = test2();
cout << a << endl;
}
int main()
{
test1();
}
按照常理,這里test2中的b出了test2應該作為局部變量被回收,但是
我們依然能得到正確答案,這是因為編譯器有對這種情況進行優(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();
}
多調用幾次打印
就會發(fā)現(xiàn)除了第一次是正常的,其余都是亂碼。
注:如果實在是要這樣搞,就加上靜態(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
相關推薦
- 2022-07-04 .NET性能優(yōu)化之為結構體數(shù)組使用StructLinq的問題解析_實用技巧
- 2022-04-27 Python?Pandas學習之基本數(shù)據(jù)操作詳解_python
- 2022-06-22 使用pyinstaller打包.exe文件的詳細教程_python
- 2021-10-22 C#?基于NAudio實現(xiàn)對Wav音頻文件剪切(限PCM格式)_C#教程
- 2022-06-12 C語言經(jīng)典順序表真題演練講解_C 語言
- 2024-04-07 MyBatis批量插入的五種方式(推薦MyBatis以集合方式批量新增)
- 2022-09-04 Redis分布式鎖解決秒殺超賣問題_Redis
- 2022-10-27 go?熔斷原理分析與源碼解讀_Golang
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結構-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支