1. 程式人生 > >C++(二十一) — 引用概念及本質

C++(二十一) — 引用概念及本質

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++(二十一) — 引用概念及本質