網(wǎng)站首頁 編程語言 正文
引用概念
引用的本質(zhì):給已有的變量名 取個別名
//給num取個別名為b int num =100; //&不是取b的地址 只是描述b是num的別名 編譯器不會為b開辟新的空間 int &b = num;//num的別名 是b //操作b等價操作num
定義步驟
1、&修飾別名
2、給哪個變量取別名 就定義哪個變量
3、從上往下 整體替換
案例1:給數(shù)組取別名
int arr[5] ={1,2,3,4,5}; int (&new_arr)[5] = arr;
法一:
void test02() { int arr[5] = {10,20,30,40,50}; //需求:給arr起個別名 int (&my_arr)[5] = arr;//my_arr就是數(shù)組arr的別名 int i=0; for(i=0;i<5;i++) { cout<<my_arr[i]<<" "; } cout<<endl; }
法二:配合typedef
void test03() { int arr[5] = {10,20,30,40,50}; //1、用typedef 給數(shù)組類型 取個別名 //TYPE_ARR就是一個數(shù)組類型(有5個元素 每個元素位int) typedef int TYPE_ARR[5]; //myArr就是數(shù)組arr的別名 TYPE_ARR &myArr=arr; int i=0; for(i=0;i<5;i++) { cout<<myArr[i]<<" "; } cout<<endl; }
引用必須初始化
int &b;//非法的
int num = 10; int &a = num; int data = 20; a = data;//不是data別名為a 而是將data值賦值a(num)
引用初始化后不能更改
引用一旦確定是誰的別名 就不能更改
int num = 10; int &b = num; int data = 20; b=data;//千萬不要認(rèn)為是b給data取別名 僅僅是將data的值賦值b也就是data賦值num
引用作為函數(shù)的參數(shù)可以替代指針變量
void swap_int01(int a1, int b1) { int tmp = a1; a1 = b1; b1 = tmp; } void swap_int02(int *a1, int *b1)//a1=&a, b1=&b { //*a1 == a, *b1 == b int tmp = *a1; *a1 = *b1; *b1 = tmp; } void swap_int03(int &a1, int &b1)//int &a1 = a, int &b1=b { //a1 == a, b1 == b int tmp = a1; a1 = b1; b1 = tmp; } void test07() { int a = 10; int b = 20; cout<<"a = "<<a<<", b = "<<b<<endl; // swap_int01(a, b);//交換 不成功 // swap_int02(&a, &b);//交換 成功 swap_int03(a, b);//交換 成功 cout<<"a = "<<a<<", b = "<<b<<endl; } int main(int argc, char *argv[]) { test07(); return 0; }
引用作為函數(shù)的參數(shù)的好處:
1、函數(shù)內(nèi)部 直接通過引用操作外部變量的值
2、省去了指針的操作
3、函數(shù)的形參不會擁有新的空間(節(jié)約了空間)
常引用
int &a = 10;//err
void test08() { //a就叫常引用 不能通過a修改空間的值 const int &a = 10;//ok cout<<"a = "<<a<<endl;//10 }
常引用 一般作為函數(shù)的參數(shù) 防止函數(shù)內(nèi)部修改外部空間值
//常引用 作為函數(shù)的參數(shù) 即節(jié)約了空間 又防止函數(shù)內(nèi)部修改外部變量的值 void printf_num(const int &a) { //a = 1000;//err cout<<" num = "<<a<<endl; } void test09() { int num = 10; printf_num(num); }
常量的引用:
void test09() { //給常量10取個別名 叫num //int &針對的是int ,10是const int類型 //const int 針對的是const int, 10是const int類型 const int &num = 10; cout<<"num = "<<num<<endl;//10 }
引用作為函數(shù)的返回值類型
當(dāng)函數(shù)返回值作為左值 那么函數(shù)的返回值類型必須是引用。
(1)、通過函數(shù)返回值 在外界操作 函數(shù)內(nèi)部申請的空間
int& get_data(void) { static int data = 100; //不要返回 普通局部變量的 引用 return data;//返回誰 外界的a就給data取別名 } void test10() { int &a = get_data(); cout<<"data = "<<a<<endl; }
(2)、引用作為函數(shù)的返回值類型 可以完成鏈?zhǔn)讲僮?/p>
引用的本質(zhì)
引用的本質(zhì)在c++內(nèi)部實(shí)現(xiàn)是一個指針常量. Type& ref = val; // Type* const ref = &val;
c++編譯器在編譯過程中使用常指針作為引用的內(nèi)部實(shí)現(xiàn),因此引用所占用的空間大小與指針相同,只是這個過程是編譯器內(nèi)部實(shí)現(xiàn),用戶不可見
引用的本質(zhì):常量指針變量
int num = 10; int &b = num;//b == num //底層實(shí)現(xiàn) //b是只讀 *b可讀可寫 int * const b = # //b = 100; *b = 100;
指針的引用(了解)
new_p就是指針的引用
指針的引用的場景:
void get_memory01(int **p1)//int **p1 = &p { //*p1 == p *p1 = (int *)calloc(1, sizeof(int)); **p1 = 100; } void get_memory02(int* &p1)//int* &p1 = p { //p1 == p p1 = (int *)calloc(1, sizeof(int)); *p1 = 100;//*p1 = *p } void test13() { int *p = NULL; //get_memory01(&p); get_memory02(p); cout<<"*p = "<<*p<<endl; }
指針和引用的區(qū)別
1、引用必須被初始化(初始值必須是一個對象),指針不必(但最好要初始化)。
2、引用初始化以后不能被改變,指針可以改變所指的對象。
3、不存在指向空值的引用,但是存在指向空值的指針。
4、指針通過某個指針變量指向一個對象后,對它所指向的變量間接操作。引用本身就是目標(biāo)變量的別名,對引用的操作就是對目標(biāo)變量的操作。
5、指針是一個對象,可以定義指向指針的指針。但引用不是對象,沒有實(shí)際地址,所以不能定義指向引用的指針,也不能定義指向引用的引用。
原文鏈接:https://blog.csdn.net/qq_34981463/article/details/124975700
相關(guān)推薦
- 2022-04-02 詳析C++中的auto_C 語言
- 2022-10-31 .Net中的Http請求調(diào)用詳解(Post與Get)_實(shí)用技巧
- 2021-12-07 C#?微信支付回調(diào)驗(yàn)簽處理的實(shí)現(xiàn)_C#教程
- 2022-03-15 React?Router?V6更新內(nèi)容詳解_React
- 2022-05-11 解決Spring Boot報(bào)錯Mapped Statements collection alread
- 2022-09-22 原型鏈及原型鏈的作用/構(gòu)造函數(shù),原型對象,實(shí)例對象的三角關(guān)系
- 2022-07-03 C語言中二級指針解析(指向指針的指針)_C 語言
- 2022-03-11 C++實(shí)操之內(nèi)聯(lián)成員函數(shù)介紹_C 語言
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- 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)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤: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)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支