寫在前面
我們經常使用#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