目錄
一、引用:
1、定義:
?2、特性:
?3、引用的使用:
4、const引用:控制權限
const引用定義:
const引用可以接收3種對象:
1、正常對象:
2、臨時對象:
3、const對象:
總結:
5、引用與指針的關系:
二、內聯函數:
?編輯?三、nullptr:
四、總結:
一、引用:
1、定義:
? ? ? ???引?不是新定義?個變量,?是給已存在變量取了?個別名,編譯器不會為引?變量開辟內存空間,它和它引?的變量共?同?塊內存空間。?如:?壺傳中李逵,宋江叫"鐵?",江湖上?稱"?旋?";林沖,外號豹?頭??
👉👉 類型& 引?別名 =? 引?對象
???引用的出現代替了指針,對引用進行修改,就相當于對本名(引用對象)進行修改
?2、特性:
//在定義時要初始化
//一個變量可以有多個引用
//引用一旦引用一個實體,再不能引用其他實體
初始化,決定了別名,該別名就一直是a的別名
?已經有了實體了,不會引用其他的實體
?
?3、引用的使用:
1. 引?在實踐中主要是于引?傳參和引?做返回值中減少拷?提?效率和改變引?對象時同時改變被引?對象。
2.引?傳參跟指針傳參功能是類似的,引?傳參相對更?便?些。
3. 引?和指針在實踐中相輔相成,功能有重疊性,但是各有特點,互相不可替代。C++的引?跟其語?的引?(如Java)是有很?的區別的,除了?法,最?的點,C++引?定義后不能改變指向,Java的引?可以改變指向。
4.?些主要?C代碼實現版本數據結構教材中,使?C++引?替代指針傳參,?的是簡化程序,避開復雜的指針
4、const引用:控制權限
先補充一點說明:?臨時對象
臨時對象:編譯器需要?個空間暫存表達式的求值結果時臨時創建的?個未命名的對象,C++中把這個未命名對象叫做臨時對象;
?👉🤔臨時對象也就是存放一些結果的變量,使用完后會銷毀
?C++規定:臨時對象具有常性(只能讀,不能改)
//表達式求值
// 1、a+b 表達式運算
// 2、int a = 1; double b = a;a轉換成double型(隱式類型的轉換)
//3、整形提升
//4、傳值調用的返回值
//5、截斷
//………………
const引用定義:
????????可以引??個const對象,但是必須?const引?。const引?也可以引?普通對象,因為對象的訪問權限在引?過程中可以縮?,但是不能放?!!!!權限小了,也就是不能進行修改了
👉總之:引用可以引用 權限比自己大的,但是不能引用 權限比自己小的,自己的權限必須和引用對象的權限相同,或者比引用對象小!!
const引用可以接收3種對象:
1、正常對象:
int main()
{int a = 10;const int& b = a;//權限縮小return 0;
}
🧑?🎓🧑?🎓但是 b不能修改a的值因為此時b的權限縮小了《《只能讀,不能修改
👉👉但是a可以進行修改
2、臨時對象:
int main()
{double a = 10;const int& b = a;//int& b = a;不可以return 0;
}
🧑?🎓🧑?🎓臨時對象具有常性,因為要發生隱式轉換,對于常性,它的權限是只讀不可改,那么我們就要一個只讀不可改的引用即const引用
對于常量也可以使用引用,但是根據權限對應,需要使用const引用才行,當然也不能給常量進行修改
int main()
{//int& a = 10;錯誤的引用,常量的權限是只讀不可改const int& a = 10;return 0;
}
3、const對象:
int main()
{const int a = 10;//具有了常屬性const int& b = a;return 0;
}
🧑?🎓🧑?🎓對于const的對象進行引用時,必須用同等權限的引用,即const引用;?
總結:
const引用就是改變了引用的控制權限權限,其權限滿足如下表達式
5、引用與指針的關系:
🧑?🎓🧑?🎓 C++中指針和引?就像兩個性格迥異的親兄弟,指針是哥哥,引?是弟弟,在實踐中他們相輔相成,功能有重疊性,但是各有??的特點,互相不可替代
?//語法概念上引?是?個變量的取別名不開空間,指針是存儲?個變量地址,要開空間。//? 引?在定義時必須初始化,指針建議初始化,但是語法上不是必須的。//? 引?在初始化時引??個對象后,就不能再引?其他對象;?指針可以在不斷地改變指向對象。//? 引?可以直接訪問指向對象,指針需要解引?才是訪問指向對象。//? sizeof中含義不同,引?結果為引?類型的??,但指針始終是地址空間所占字節個數(32位平臺下占4個字節,64位下是8byte)//? 指針很容易出現空指針和野指針的問題,引?很少出現,引?使?起來相對更安全?些
二、內聯函數:
關鍵字:inline + 函數聲明
🧑?🎓🧑?🎓inline修飾函數,編譯時C++編譯器會在調?的地?展開內聯函數,這樣調?內聯函數就不需要建?棧幀了,就可以提?效率
🧑?🎓🧑?🎓inline對于編譯器??只是?個建議(我和你說一聲,聽不聽,取決于你的想法,我無法左右你必須聽我的),也就是說,你加了inline 編譯器也可以?選擇在調?的地?不展開,不同編譯器關于inline什么情況展開各不相同,因為C++標準沒有規定這個。??inline適?于頻繁調?的短?函數,對于遞歸函數,代碼相對多?些的函數,加上inline也會被編譯器忽略展開太多了,代碼量會太大??
???C語?實現宏函數也會在預處理時替換展開,但是宏函數實現很復雜很容易出錯的,且不?便調試,C++設計了inline?的就是替代C的宏函數
注意:inline不建議聲明和定義分離到兩個?件(分裝),分離會導致鏈接錯誤。因為inline被展開,就沒有函數地址,鏈接時會出現報錯。

?三、nullptr:
C++中NULL可能被定義為字?常量0,或者 C中被定義為?類型指針(void*)的常量。🧑?🎓🧑?🎓不論采取何種定義,在使?空值的指針時,都不可避免的會遇到?些?煩;
🧑?🎓🧑?🎓 C++11中引?nullptr,nullptr是?個特殊的關鍵字,nullptr是?種特殊類型的字?量,它可以轉換成任意其他類型的指針類型。使?nullptr定義空指針可以避免類型轉換的問題,因為nullptr只能被隱式地轉換為指針類型,?不能被轉換為整數類型。
🧑?🎓🧑?🎓C++不允許void*類型的數據給其他類型的指針,必須墻磚同類型;
void f1(int x)
{cout << "f(int x)" << endl;
}
void f1(int* ptr)
{cout << "f(int* ptr)" << endl;
}
int main()
{f1(0);// f1(NULL);//相當于傳一個常數0f1((int*)NULL);// f1((void*)NULL);將NULL強轉為指針類型f1(nullptr);//空指針return 0;
}
nullptr相當于c語言中的NULL,但是不能轉換成整形
四、總結:
?繼續努力!!