C++(二十一) — 引用概念及本質
阿新 • • 發佈:2018-12-20
color 概念 調用 main 字節 sizeof 一個 strong 操作
1、引用概念
引用是別名,必須在聲明的時候初始化。即:是指一個已定義變量的別名。(一個內存空間,有兩個名字都可以操作)
引用:在函數調用時,是變量的別名,不可以單獨存在,使用時必須要初始化;
指針:本身有自己的地址,可以單獨存在。
2、引用基本舉例
引用在交換時的例子:
void myswap01(int a, int b) { int c = 0; c = a; a = b; b = c; } void myswap02(int *a, int *b) { int c = 0; c = *a; *a = *b;*b = c; } // 引用,變量的別名,指代同一個存儲空間 void myswap03(int &a, int &b) { int c = 0; c = a; a = b; b = c; } void main() { int x = 10, y = 20; myswap01(x, y); cout << "x= " << x << " y= " << y << endl; myswap02(&x, &y); cout << "x= " << x << " y= " << y << endl; myswap03(x, y); cout << "x= " << x <<" y= " << y << endl; system("pause"); }
3、引用本質思考
(1)引用就是別名,指向同一塊內存空間。
(2)引用占用字節:int &a,,占用4個字節,就相當於一個指針所占的內存;引用有自己的存儲空間,保存地址;
struct teacher {int age; // 4 char & a;//4,,相當於一個指針,占用4個字節 double &b;//4 }; void main() { cout << sizeof(teacher) << endl;//12 system("pause"); }
(3)本質:引用在C++中的內部實現:一個常量指針,所以引用所占內存大小和指針相同;
int& age ——> int* const age
相當於:編譯器幫我們取了一個實參地址。
4、引用作為函數返回值
1、函數返回值為引用時,內存空間是必須要存在的(靜態變量、全局變量),如果返回的是棧變量(局部變量),會出錯,因為局部變量在函數返回時,地址就銷毀了,比如下面的錯誤例子:
int& get2() { int a; a = 10; return a; }
如果返回的引用值,是靜態變量或全局變量,則可以。
關鍵:看返回的內存空間是不是有效的內存空間。
2、引用作為左值,關鍵:看返回的內存空間是不是有效的內存空間。
// 返回的是一個值 int get1() { int a; a = 10; return a; } // 返回的是變量本身 int& get2() { static int a =10; a++; cout << "a:" << a << endl; return a; } void main() { get2() = 100; // 10 get2(); // 101 system("pause"); }
5、常量引用
int x = 10; // 常量引用,變量只有只讀屬性,不能通過 y 去改變 x 的值 // 必須要初始化 const int &y = x; // int &m = 11;// 11沒有內存地址,所以錯誤, const int &z = 12; // 此時常量引用可以,編譯器分配了內存空間給 Z,保存值:12
C++(二十一) — 引用概念及本質