06-引用

東閣堂主發表於2019-02-07

寫在前面

我們經常使用#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

當然C++大神就繞吧,非喜勿噴,畢竟這是個人的學習筆記?

相關文章