国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【C++初階】C++基礎(chǔ)(下)——引用、內(nèi)聯(lián)函數(shù)、auto關(guān)鍵字、基于范圍的for循環(huán)、指針空值nullptr

這篇具有很好參考價(jià)值的文章主要介紹了【C++初階】C++基礎(chǔ)(下)——引用、內(nèi)聯(lián)函數(shù)、auto關(guān)鍵字、基于范圍的for循環(huán)、指針空值nullptr。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

?

目錄

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?引用概念

引用 不是新定義一個(gè)變量,而 是給已存在變量取了一個(gè) 別名 ,編譯器不會(huì)為引用變量開辟內(nèi)存空間,它和它引用的變量共用同一塊內(nèi)存空間。

?類型& 引用變量名(對(duì)象名) =?引用實(shí)體(注意:引用類型必須和引用實(shí)體同種類型

【C++初階】C++基礎(chǔ)(下)——引用、內(nèi)聯(lián)函數(shù)、auto關(guān)鍵字、基于范圍的for循環(huán)、指針空值nullptr,C++,筆記,c++,開發(fā)語(yǔ)言

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;
}

【C++初階】C++基礎(chǔ)(下)——引用、內(nèi)聯(lián)函數(shù)、auto關(guān)鍵字、基于范圍的for循環(huán)、指針空值nullptr,C++,筆記,c++,開發(fā)語(yǔ)言

?

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?傳值、傳引用效率比較

作為參數(shù)或者返回值類型,在傳參和返回期間,函數(shù)不會(huì)直接傳遞實(shí)參或者將變量本身直接返回, 而是 傳遞實(shí)參或者返回變量的一份 臨時(shí)的拷貝 ,因此用值作為參數(shù)或者返回值類型,效率是非常低下的,尤其是當(dāng)參數(shù)或者返回值類型非常大時(shí),效率就更低。(傳地址和傳引用是差不多的)
傳值和傳引用在作為傳參以及返回值類型上效率相差很大

1.6?引用和指針的區(qū)別

引用和指針的不同點(diǎn) :
1. 引用概念上定義一個(gè)變量的別名,指針存儲(chǔ)一個(gè)變量地址。
2. 引用 在定義時(shí) 必須初始化 ,指針沒有要求
3. 引用 在初始化時(shí)引用一個(gè)實(shí)體后,就 不能再引用其他實(shí)體 ,而指針可以在任何時(shí)候指向任何一個(gè)同類型實(shí)體
4. 沒有 NULL 引用 ,但有 NULL 指針
5. sizeof 中含義不同 引用 結(jié)果為 引用類型的大小 ,但 指針 始終是 地址空間所占字節(jié)個(gè)數(shù) (32 位平臺(tái)下占4個(gè)字節(jié) )
6. 引用自加即引用的實(shí)體增加 1 ,指針自加即指針向后偏移一個(gè)類型的大小
7. 有多級(jí)指針,但是沒有多級(jí)引用
8. 訪問實(shí)體方式不同, 指針需要顯式解引用,引用編譯器自己處理
9. 引用比指針使用起來相對(duì)更安全
語(yǔ)法的角度:引用是一個(gè)別名,沒有額外開空間,指針存儲(chǔ)的是地址,需要開一個(gè)4/8字節(jié)的空間;但是從底層的角度,是一樣的方式實(shí)現(xiàn)的(匯編代碼是一致的)

2.?內(nèi)聯(lián)函數(shù)

2.1?概念

inline 修飾 的函數(shù)叫做 內(nèi)聯(lián)函數(shù) , 編譯時(shí) C++ 編譯器會(huì)在 調(diào)用內(nèi)聯(lián)函數(shù)的地方展開 ,沒有函數(shù)調(diào)用建立棧幀的開銷,內(nèi)聯(lián)函數(shù) 提升程序運(yùn)行的效率。
在函數(shù)前增加 inline 關(guān)鍵字將其改成內(nèi)聯(lián)函數(shù),在編譯期間編譯器會(huì)用函數(shù)體替換函數(shù)的調(diào)用。

知識(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?特性

1. inline 是一種 以空間換時(shí)間 的做法,省去調(diào)用函數(shù)額開銷。所以 代碼很長(zhǎng)(大于10行) 或者有 循環(huán) / 遞歸 的函數(shù)不適宜使用作為內(nèi)聯(lián)函數(shù)。
2. inline 對(duì)于編譯器而言 只是一個(gè)建議 ,編譯器會(huì)自動(dòng)優(yōu)化,如果定義為 inline 的函數(shù)體內(nèi)有循環(huán) / 遞歸等等,編譯器優(yōu)化時(shí)會(huì)忽略掉內(nèi)聯(lián)。
3. inline 不建議聲明和定義分離 (頭文件中,兩個(gè)都寫),分離會(huì)導(dǎo)致鏈接錯(cuò)誤。因?yàn)?/span> inline 被展開,就沒有函數(shù)地址了,鏈接就會(huì)找不到。
知識(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. 常量定義 換用 const
2. 函數(shù)定義 換用內(nèi)聯(lián)函數(shù)

3.auto關(guān)鍵字(C++11)

3.1?類型別名思考

隨著程序越來越復(fù)雜,程序中用到的類型也越來越復(fù)雜,經(jīng)常體現(xiàn)在:
1. 類型難于拼寫
2. 含義不明確導(dǎo)致容易出錯(cuò)

【C++初階】C++基礎(chǔ)(下)——引用、內(nèi)聯(lián)函數(shù)、auto關(guān)鍵字、基于范圍的for循環(huán)、指針空值nullptr,C++,筆記,c++,開發(fā)語(yǔ)言

?auto可以自動(dòng)定義類型,根據(jù)等號(hào)后面的變量

C++中,typeid(A).name();可以知道A的類型是什么

3.2 auto簡(jiǎn)介

在早期 C/C++ auto 的含義是:使用 auto 修飾的變量,是具有自動(dòng)存儲(chǔ)器的局部變量
C++11 中,標(biāo)準(zhǔn)委員會(huì)賦予了 auto 全新的含義即: auto 不再是一個(gè)存儲(chǔ)類型指示符,而是作為一個(gè)新的類型 指示符來指示編譯器, auto 聲明的變量必須由編譯器在編譯時(shí)期推導(dǎo)而得 。
使用 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 聲明 指針類型 時(shí),用 auto auto* 沒有任何區(qū)別,但用 auto 聲明引用類型時(shí)則必須加 &

auto*定義的必須是指針類型

2. 在同一行定義多個(gè)變量
當(dāng)在同一行聲明多個(gè)變量時(shí),這些變量必須是 相同的類型 ,否則編譯器將會(huì)報(bào)錯(cuò),因?yàn)榫幾g器實(shí)際只對(duì) 第一個(gè)類型進(jìn)行推導(dǎo),然后用推導(dǎo)出來的類型定義其他變量 。

auto意義之一:類型很長(zhǎng)時(shí),懶得寫,可以讓他自動(dòng)推導(dǎo)。?

3.4 auto不能推導(dǎo)的場(chǎng)景

1. auto 不能作為函數(shù)的參數(shù)以及函數(shù)的返回值
// 此處代碼編譯失敗,auto不能作為形參類型,因?yàn)榫幾g器無(wú)法對(duì)a的實(shí)際類型進(jìn)行推導(dǎo)
void TestAuto(auto a)
{}
2. auto 不能直接用來聲明數(shù)組
void TestAuto()
{
 int a[] = {1,2,3};
 auto b[] = {4,5,6};
}

3. 為了避免與C++98中的auto發(fā)生混淆,C++11只保留了auto作為類型指示符的用法

4. auto 在實(shí)際中最常見的優(yōu)勢(shì)用法就是跟以后會(huì)講到的 C++11 提供的新式 for 循環(huán),還有 lambda 表達(dá)式等進(jìn)行配合使用。

4.?基于范圍的for循環(huán)(C++11)

4.1?范圍for的語(yǔ)法

C++11 中引入了基于范圍的for 循環(huán)。 for 循環(huán)后的括號(hào)由冒號(hào) 分為兩部分:第一部分是范圍內(nèi)用于迭代的變量, 第二部分則表示被迭代的范圍
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 << " ";
	}
}
與普通循環(huán)類似,可以用 continue 來結(jié)束本次循環(huán),也可以用 break 來跳出整個(gè)循環(huán) 。

4.2?范圍for的使用條件

1. for 循環(huán)迭代的范圍必須是確定的
對(duì)于數(shù)組而言,就是數(shù)組中第一個(gè)元素和最后一個(gè)元素的范圍 ;對(duì)于類而言,應(yīng)該提供 begin end
方法, begin end 就是 for 循環(huán)迭代的范圍。
注意:以下代碼就有問題,因?yàn)?/span> for 的范圍不確定
void TestFor(int array[])
{
 for(auto& e : array)
 cout<< e <<endl;
}

這里的array是數(shù)組的首元素的地址,所以范圍不定文章來源地址http://www.zghlxwxcb.cn/news/detail-614839.html

2. 迭代的對(duì)象要實(shí)現(xiàn) ++ == 的操作

5.?指針空值nullptr(C++11)

5.1 C++98中的指針空值


	//指針初始化
	int* p1 = NULL;
	int* p2 = 0;
	int* p3 = nullptr;//建議用這一種
C++98 中,字面常量 0 既可以是一個(gè)整形數(shù)字,也可以是無(wú)類型的指針 (void*) 常量,但是編譯器默認(rèn)情況下將其看成是一個(gè)整形常量,如果要將其按照指針方式來使用,必須對(duì)其進(jìn)行強(qiáng)轉(zhuǎn)(void *)0 。
注意:
1. 在使用 nullptr 表示指針空值時(shí),不需要包含頭文件,因?yàn)?/strong> nullptr C++11 作為新關(guān)鍵字引入的 。
2. C++11 中, sizeof(nullptr) sizeof((void*)0) 所占的字節(jié)數(shù)相同。
3. 為了提高代碼的健壯性,在后續(xù)表示指針空值時(shí)建議最好使用 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)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包