?
目錄
1.?引用
1.1?引用概念
1.2?引用特性
1.3?常引用
1.4?使用場(chǎng)景
1.5?傳值、傳引用效率比較
1.6?引用和指針的區(qū)別
2.?內(nèi)聯(lián)函數(shù)
2.1?概念
2.2?特性
3.auto關(guān)鍵字(C++11)
3.1?類型別名思考
3.2 auto簡(jiǎn)介
3.3 auto的使用細(xì)則
3.4 auto不能推導(dǎo)的場(chǎng)景
4.?基于范圍的for循環(huán)(C++11)
4.1?范圍for的語(yǔ)法
4.2?范圍for的使用條件
5.?指針空值nullptr(C++11)
5.1 C++98中的指針空值
???沒有堅(jiān)持的努力,本質(zhì)上并沒有多大的意義。
1.?引用
1.1?引用概念
?類型& 引用變量名(對(duì)象名) =?引用實(shí)體(注意:引用類型必須和引用實(shí)體是同種類型的)
b叫做a的引用,b也可以叫做a的別名(abcd四個(gè),只要有一個(gè)發(fā)生變化,其余都發(fā)生變化)
應(yīng)用1:
void Swap(int& a, int& b) { int tmp = a; a = b; b = tmp; }
數(shù)據(jù)進(jìn)行交換,可以不用傳指針,可以用引用
應(yīng)用2:
#include <iostream> typedef struct ListNode { int val; struct ListNode* next; }LTNode; void LTPushBack_C(LTNode** pphead, int x) { //C語(yǔ)言,單鏈表尾插需要傳結(jié)構(gòu)體的二級(jí)指針,因?yàn)樾枰淖兪撞康刂?} void LTPushBack_CPP(LTNode*& phead, int x) { //C++中,用引用,僅僅需要傳結(jié)構(gòu)體地址 } int main() { LTNode* plist = NULL; //初始化 LTPushBack_C(&plist, 1); LTPushBack_CPP(plist, 1); return 0; }
也可以引用指針類型的?
注意:
typedef struct ListNode { int val; struct ListNode* next; }LTNode,*PLTNode; void LTPushBack_CPP(LTNode*& phead, int x) { //C++中,用引用,僅僅需要傳結(jié)構(gòu)體地址 } //這兩個(gè)等同 void LTPushBack_CPP(PLTNode& phead, int x) { //C++中,用引用,僅僅需要傳結(jié)構(gòu)體地址 }
1.2?引用特性
代碼展示:
#include <iostream>
int main()
{
int a = 10;
int& b = a;
int& c = a;
int& d = b;
//一個(gè)變量可以多次引用
int& e;//代碼運(yùn)行到這里會(huì)報(bào)錯(cuò),因?yàn)橐迷诙x時(shí)必須初始化
int m = 2;
b = m;//b在前面已經(jīng)引用了a,在這里并不是成為m的別名,而是把m的值賦值給b,然后此時(shí)abcd的值都是2
return 0;
}
1. 引用在 定義時(shí)必須初始化2. 一個(gè)變量可以有多個(gè)引用3. 引用一旦引用一個(gè)實(shí)體,再不能引用其他實(shí)體
1.3?常引用
const修飾的變量,只能讀不能寫(這里的權(quán)限,指的是讀和寫)
#include <iostream> int main() { int a = 0; int& b = a;//權(quán)限不變 const int c = 2; int& d = c;//這里是錯(cuò)誤的,權(quán)限不能被放大 const int x = 3; const int& y = x;//這里是可以的,權(quán)限不變 int m = 6; const int& n = m;//這里是可以的,權(quán)限縮小 return 0; }
取別名原則:對(duì)于引用類型,權(quán)限只能縮小,不能放大
臨時(shí)變量具有常性
#include <iostream> int main() { int a = 10; int& b = a; const int& c = 20;//常量也可以取別名 double d = 15.3; int f = d;//在這里,相當(dāng)于f把自己的整數(shù)部分給一個(gè)臨時(shí)變量,臨時(shí)變量把值賦給f(臨時(shí)變量具有常性) const int& e = d;//這里的e不是d的引用,而是臨時(shí)變量的引用 return 0; }
?
1.4?使用場(chǎng)景
(1)做參數(shù)
void Swap(int& a, int& b)
{
int tmp = a;
a = b;
b = tmp;
}
可以不用傳指針
(2)做返回值
代碼1展示:(傳值返回)
#include <iostream> int Count() { int n = 0; n++; return n; }//n出了這個(gè)函數(shù)就被銷毀了,所以是賦值給臨時(shí)變量的 int main() { int ret = Count(); return 0; }
函數(shù)返回過程,把返回的值n給一個(gè)臨時(shí)變量,臨時(shí)變量的類型就是函數(shù)類型(上述代碼的int),臨時(shí)變量再把值賦給主函數(shù)的ret。(臨時(shí)變量即有一個(gè)拷貝)
代碼2展示:(傳引用拷貝)
#include <iostream> int& Count() { static int n = 0;//static不能去掉,如果去掉,就會(huì)涉及出現(xiàn)越界問題(因?yàn)榭臻g被系統(tǒng)回收) n++; return n; }//返回int&,說明有一個(gè)臨時(shí)引用是int&類型,臨時(shí)引用是n的別名 int main() { int& ret = Count();//ret是臨時(shí)引用的別名, return 0; }
沒有拷貝,效率高
如果函數(shù)返回時(shí),出了函數(shù)作用域,如果返回對(duì)象還在 ( 還沒還給系統(tǒng) ) ,則可以使用引用返回, 如果已經(jīng)還給系統(tǒng)了,則必須使用傳值返回。(否則會(huì)出現(xiàn)越界問題)
注意:
#include <iostream>
int Count()
{
int n = 0;
n++;
return n;
}
int main()
{
const int& ret = Count();//因?yàn)槭桥R時(shí)變量的別名,臨時(shí)變量具有常性
return 0;
}
1.5?傳值、傳引用效率比較
1.6?引用和指針的區(qū)別
語(yǔ)法的角度:引用是一個(gè)別名,沒有額外開空間,指針存儲(chǔ)的是地址,需要開一個(gè)4/8字節(jié)的空間;但是從底層的角度,是一樣的方式實(shí)現(xiàn)的(匯編代碼是一致的)
2.?內(nèi)聯(lián)函數(shù)
2.1?概念
知識(shí)復(fù)習(xí):寫一個(gè)ADD的宏
?inline存在的意義:(1)解決宏函數(shù)晦澀難懂、容易寫錯(cuò)(2)宏不支持調(diào)試
優(yōu)點(diǎn):(1)debug支持調(diào)試(2)不易寫錯(cuò),就是普通函數(shù)的寫法(3)提升程序的效率
2.2?特性
知識(shí)點(diǎn) :宏的優(yōu)缺點(diǎn)?優(yōu)點(diǎn):1. 增強(qiáng)代碼的復(fù)用性。2. 提高性能。缺點(diǎn):1. 不方便調(diào)試宏。(因?yàn)轭A(yù)編譯階段進(jìn)行了替換)2. 導(dǎo)致代碼可讀性差,可維護(hù)性差,容易誤用。3. 沒有類型安全的檢查 。C++ 有哪些技術(shù)替代宏 ?1. 常量定義 換用 const2. 函數(shù)定義 換用內(nèi)聯(lián)函數(shù)
3.auto關(guān)鍵字(C++11)
3.1?類型別名思考
?auto可以自動(dòng)定義類型,根據(jù)等號(hào)后面的變量
C++中,typeid(A).name();可以知道A的類型是什么
3.2 auto簡(jiǎn)介
使用 auto 定義變量時(shí) 必須對(duì)其進(jìn)行初始化 ,在編譯階段編譯器需要根據(jù)初始化表達(dá)式來推導(dǎo) auto 的實(shí)際類 型 。因此 auto 并非是一種 “ 類型 ” 的聲明,而是一個(gè)類型聲明時(shí)的 “占位符” ,編譯器在編譯期會(huì)將 auto 替換為 變量實(shí)際的類型 。
3.3 auto的使用細(xì)則
(1)auto與指針和引用結(jié)合起來使用
(auto*定義的必須是指針類型)
auto意義之一:類型很長(zhǎng)時(shí),懶得寫,可以讓他自動(dòng)推導(dǎo)。?
3.4 auto不能推導(dǎo)的場(chǎng)景
// 此處代碼編譯失敗,auto不能作為形參類型,因?yàn)榫幾g器無(wú)法對(duì)a的實(shí)際類型進(jìn)行推導(dǎo)
void TestAuto(auto a)
{}
void TestAuto()
{
int a[] = {1,2,3};
auto b[] = {4,5,6};
}
3. 為了避免與C++98中的auto發(fā)生混淆,C++11只保留了auto作為類型指示符的用法 文章來源:http://www.zghlxwxcb.cn/news/detail-614839.html
4.?基于范圍的for循環(huán)(C++11)
4.1?范圍for的語(yǔ)法
void TestFor()
{
int array[] = { 1, 2, 3, 4, 5 };
//加&的原因是e是array內(nèi)容的拷貝,所以改變e不是改變array里面的內(nèi)容
for (auto& e : array)
{
e *= 2;
}
//范圍for,依次自動(dòng)取arrar中的數(shù)據(jù),賦值給e,自動(dòng)判斷結(jié)束
for (auto e : array)//這里寫int也可以
{
cout << e << " ";
}
}
4.2?范圍for的使用條件
void TestFor(int array[])
{
for(auto& e : array)
cout<< e <<endl;
}
這里的array是數(shù)組的首元素的地址,所以范圍不定文章來源地址http://www.zghlxwxcb.cn/news/detail-614839.html
5.?指針空值nullptr(C++11)
5.1 C++98中的指針空值
//指針初始化
int* p1 = NULL;
int* p2 = 0;
int* p3 = nullptr;//建議用這一種
到了這里,關(guān)于【C++初階】C++基礎(chǔ)(下)——引用、內(nèi)聯(lián)函數(shù)、auto關(guān)鍵字、基于范圍的for循環(huán)、指針空值nullptr的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!