06-引用

寫在前面

我們經常使用#ifndef、#define、#endif來防止頭文件的內容被重複包含
◼#pragma once可以防止整個文件的內容被重複包含
◼區別
#ifndef、#define、#endif受C\C++標準的支持,不受編譯器的任何限制
有些編譯器不支持#pragma once(較老編譯器不支持,如GCC 3.4版本之前),兼容性不夠好
#ifndef、#define、#endif可以針對一個文件中的部分代碼,而#pragma once只能針對整個文件

名詞解釋

◼ 在C語言中,使用指針(Pointer)可以間接獲取、修改某個變量的值 
◼ 在C++中,使用引用(Reference)可以起到跟指針類似的功能
◼ 注意點 
引用相當於是變量的別名(基本數據類型、枚舉、結構體、類、指針、數組等,都可以有引用) 對引用做計算,就是對引用所指向的變量做計算
在定義的時候就必須初始化,一旦指向了某個變量,就不可以再改變,“從一而終” 
可以利用引用初始化另一個引用,相當於某個變量的多個別名 不存在【引用的引用、指向引用的指針、引用數組】
◼ 引用存在的價值之一:比指針更安全、函數返回值可以被賦值
接下來我們再來const--下一講會專門來講 字段(ios開發者不會陌生),常引用,數組的引用,表達式的引用

常引用const

將main.m 改爲mian.mm 文件(以後若是同樣的操作,將不再贅述)
◼ const是常量的意思,被其修飾的變量不可修改 
如果修飾的是類、結構體(的指針),其成員也不可以更改
◼ 引用可以被const修飾,這樣就無法通過引用修改數據了,可以稱爲常引用 
const必須寫在&符號的左邊,才能算是常引用
◼ const引用的特點 可以指向臨時數據(常量、表達式、函數返回值等) 
可以指向不同類型的數據 
作爲函數參數時(此規則也適用於const指針)
✓ 可以接受const和非const實參(非const引用,只能接受非const實參)
✓ 可以跟非const引用構成重載
◼ 當常引用指向了不同類型的數據時,會產生臨時變量,即引用指向的並不是初始化時的那個變量

int a = 20;
int &page = age;
其中page就是一個引用
const 也是老生常談的問題
int a = 20;
const int *page = age;
page 被 const修飾,則page不可改變了,就是固定的值了

int a = 10;
int *p = &a;
*p = 30;
cout << a << endl;
打印結果:
30

數組引用

int array[] = { 10, 20, 30 };
int (&rArray)[3] = array;
cout << array << endl;
cout << &rArray << endl;
打印結果
0x7ffeefbff54c
0x7ffeefbff54c
在函數調用,需要傳入數組參數時,就可以傳入引用
void testArray(int (&array)[3])
{
    cout << "size:" << sizeof(array) << endl;
    for (int i = 0; i < sizeof(array)/4; i++)
    {
        cout << array[i] << endl;
    }
}
//sizeof 計算對象的大小 是字節爲單位的, sizeof(array)/4 就是有多小個int 數據
int array[] = { 10, 20, 30 };
testArray(array);
打印結果:
size:12
10
20
30

再舉幾個🌰(枚舉,結構體)

enum Season {
    Spring,
    Summer,
    Fall,
    Winter
};

struct Student {
    int age;
};

Season season;
Season &rSeason = season;
rSeason = Winter;
cout << season << endl;
    
Student stu;
Student &rStu = stu;
rStu.age = 20;
cout << stu.age << endl;
看下打印結果:
3
20

裝逼一下

引用的本質
◼ 引用的本質就是指針,只是編譯器削弱了它的功能,所以引用就是弱化了的指針
◼ 一個引用佔用一個指針的大小
 

完整代碼demo,請移步GitHub:DDGLearningCpp

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章