C++ —— C++引用
C++引用
?
一、普通引用
【變量名】
變量名實質上是一段連續存儲空間的別名,是一個標號
程序中通過變量來申請并命名內存空間
通過變量的名字可以使用存儲空間
問題1:對一段連續的內存空間只能取一個別名嗎?【不是】
1、引用是C++的概念
// 問題:C中可以編譯通過嗎?
int main(void) {int a = 0;int &b= a; //int * const b = &ab=11;//*b = 11;return 0; }// ?gcc編譯結果?
// 錯誤: expected identifier or ‘(’ before ‘&’token
//‘b’未聲明(在此函數內第一次使用)
// 結論:請不要用C的語法考慮 b=11
?
2、引用概念
(1)在C++中新增加了引用的概念
(2)引用可以看作一個已定義變量的別名
(3)引用的語法:Type& name = var;
(4)引用做函數參數?(引用作為函數參數聲明時不進行初始化)
int main(void) {int a = 1;int &b = a;//b是a的別名,請問c++編譯器后面做了什么工作?b = 5;cout<< "b--->"<< a << endl; return 0; }【普通引用在聲明時必須用其它的變量進行初始化】
3、引用的意義
(1)引用作為其它變量的別名而存在,因此在一些場合可以代替指針
(2)引用相對于指針來說具有更好的可讀性和實用性
void swap(int &a, int &b) {int t = a;a = b;b = t; }void swap(int*a, int *b) {int t = *a;*a = *b;*b = t; }4、普通引用有自己的空間嗎?
#include <stdio.h>struct stu {int &a;int &b; };int main(void) {printf("sizeof(stu) =%d\n", sizeof(stu));return 0; } // 8【引用是一個有地址,引用是常量(char *const p)】
5、引用的本質
(1)引用在C++中的內部實現是一個常指針
? ? ? ? ?Type&name ?èType*const name
(2)C++編譯器在編譯過程中使用常指針作為引用的內部實現,因此引用所占用的空間大小與指針相同。
(3)從使用的角度,引用會讓人誤會其只是一個別名,沒有自己的存儲空間。這是C++為了實用性而做出的細節隱藏
6、引用注意點
(1)當函數返回值為引用時
? ? ? ? ? 若返回棧變量
? ? ? ? ?不能成為其它引用的初始值
? ? ? ? ?不能作為左值使用
(2)若返回靜態變量或全局變量
? ? ? ? ?可以成為其他引用的初始值
? ? ? ? ?即可作為右值使用,也可作為左值使用?
【當實參傳給形參引用的時候,只不過是c++編譯器幫我們程序員手工取了一個實參地址,傳給了形參引用(常量指針)】
?
二、常引用
1、const引用(使用變量初始化)
【const在C中是只讀變量,在C++中是常量】
const Type& name = var;【const引用讓變量擁有只讀屬性】
#include <iostream> using namespace std;int main(void) {int a = 2;const int &b = a;b= 3;cout<< a << b << &a << &b << endl;return 0; }// 錯誤:向只讀形參‘b’賦值
2、const引用(使用字符常量初始化)
(1)用變量對const引用初始化,const引用分配內存空間了嗎?
(2)用常量對const引用初始化,const引用分配內存空間了嗎?
#include <iostream> using namespace std;int main(void) {const int &a = 10;int *p = (int *)&a;*p = 12;cout << a<< endl;return 0; }//當使用常量(字面量)對const引用進行初始化時,C++編譯器會為常量值分配空間,并將//引用名作為這段空間的別名
//使用常量對const引用初始化后將生成一個只讀變量
?
const&相當于const int ?*const a;
普通引用相當于int *const a;
三、引用與指針有什么區別
(1) 引用必須被初始化,指針不必。
(2) 引用初始化以后不能被改變,指針可以改變所指的對象。
(3) 不存在指向空值的引用,但是存在指向空值的指針。
總結
以上是生活随笔為你收集整理的C++ —— C++引用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PUN☀️四、服务器大厅建房解析
- 下一篇: C++模拟鼠标移动