網站首頁 編程語言 正文
1.引用的基本用法
引用是C++對C的重要擴充。在c/c++中,指針用法基本一致。但是C++增加了另一種給函數傳遞地址的途徑,這就是引用傳遞,也存在去其他語言,并不會是C++獨有。
1.1 引用的實質
原類型 &別名 = 舊名
1.2 引用的用法
注意事項:
引用一旦初始化,不能更改引用的指向
引用定義時必須初始化 不能引用NULL
引用可以引用任意類型包括數組
&在等號的左邊是引用,在等號的右邊是取地址
?代碼
#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; 引用定義時必須初始化
}
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.函數中的引用
引用可以作為函數的形參 ,不能返回局部變量的引用
在C語言中我們記得我們可以用指針解決函數不能交換值的問題。
swap(int *x ,int *y)
{
int temp = *x;
*x = *y;
*y = temp;
}
void test01()
{
int a = 10;
int b = 20;
swap(&a,&b);
}
在C++中可以也使用引用很好的解決這個問題
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);
}
如果想開辟數組地址,用指針的做法是
//形參是指針 引用
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);
}
能不能返回一個變量的引用 看這個變量的空間是否被釋放了
int & test04()
{
//能不能返回一個變量的引用 看這個變量的空間是否被釋放了
static int b = 100;
int a = 10;
//return a;//err 不能返回局部變量的引用
return b;//可以返回靜態的變量的引用
}
3.引用的本質
引用的本質是一個指針常量
type &b = a; 編譯器底層這么實現的: type *const b = &a
比如你寫
int &b = a;? // 編譯器優化為?int * const b = &a?
4.指針的引用
套用引用公式: type &q = p
如果想改變p的內容,函數傳遞的時候按照指針的方法傳的是地址,如下:? get_mem(&p);
如果你想用引用的方法直接傳就行
void test03()
{
? int *p = NULL;
? get_mem(&p);
? get_mem_ref(p);
}
5.常量引用
const type &p = q;
常量引用代表不能通過引用去修改引用標識的那塊空間
int a = 10;
const int &b = a;
如果你再去? 讓 b = 1000;就是錯誤的?
雖然不能引用常量,但是可以加const來引用
int &b = 100; //不能引用常量
改為
const int &b = 1;
原理上是 等價于,相當于讓tmp? = 1
int tmp =1 ,const int &b= tmp;
補充:引用和指針的區別(重要)
從底層匯編的角度來說,引用和指針是沒有區別的,都是以存地址的方式實現的(了解即可)
不同點:
- 引用概念上是定義一個變量的別名,指針是存儲一個變量地址。
- 引用定義的時候必須初始化,而指針沒有要求。
- 引用在初始化一個實體后,就不能再引用其他實體,但指針可以在任何時候指向任何一個同類型的實體。
- 沒有NULL引用,但有NULL指針。
- 引用比指針使用起來更安全
- 再sizeof中含義不同:引用結果為引用類型的大小,但指針始終是地址空間所占字節個數(32位平臺下是4)
- 引用自加即引用的實體增加1,指針自加即指針向后偏移一個類型的大小。
- 有多級指針,但沒有多級引用
- 訪問實體方式不同,指針需要解引用,引用的話編譯器會自己處理。
總結
原文鏈接:https://blog.csdn.net/qq_64691289/article/details/128388930
相關推薦
- 2023-09-17 Could not initialize class net.sf.cglib.beans.Bean
- 2022-10-11 React - 當輸入框獲取焦點時自動選中輸入框中的內容
- 2022-05-20 快速安裝Docker詳細步驟教程_docker
- 2023-02-15 PyQt5頁面跳轉問題及解決方式_python
- 2022-06-02 jquery實現界面點擊按鈕彈出懸浮框_jquery
- 2022-10-19 react封裝Dialog彈框的方法_React
- 2023-03-26 WPF實現頁面的切換的示例代碼_C#教程
- 2022-08-29 Python可視化神器pyecharts之繪制箱形圖_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支