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

【C++】引用、內(nèi)聯(lián)函數(shù)、auto關(guān)鍵字等

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

前言:在前面我們講解了C++入門基礎(chǔ)的一些學(xué)習(xí)例如命名空間、缺省參數(shù)、函數(shù)重載等。今天我們將進(jìn)一步的學(xué)習(xí),跟著博主的腳步再次往前邁一步吧。

?? 博主CSDN主頁:衛(wèi)衛(wèi)衛(wèi)的個(gè)人主頁 ??
?? 專欄分類:高質(zhì)量C++學(xué)習(xí) ??
??代碼倉庫:衛(wèi)衛(wèi)周大胖的學(xué)習(xí)日記??
??關(guān)注博主和博主一起學(xué)習(xí)!一起努力!
【C++】引用、內(nèi)聯(lián)函數(shù)、auto關(guān)鍵字等,高質(zhì)量C++的學(xué)習(xí),c++,開發(fā)語言



C++入門

引用

C++中引用是一種特殊的變量類型,它類似于一個(gè)別名,可以用來引用另一個(gè)變量。引用用&符號(hào)來聲明,對(duì)于一個(gè)已經(jīng)存在的變量,可以使用引用來訪問該變量的值。如果我們還是無法理解什么是引用,我們可以通俗的理解成,你的名字叫張三,但是你的小名叫三三、阿三等等,無論小名是什么,這個(gè)名字的本質(zhì)都是指代著你這個(gè)人。
語法說明:類型& 引用變量名(對(duì)象名) = 引用實(shí)體

引用可以有以下特點(diǎn)

  1. 引用必須在聲明時(shí)初始化,并且不能改變引用的目標(biāo)。一旦指定了引用的目標(biāo),它將始終引用該目標(biāo)。

  2. 引用可以用來修改引用的目標(biāo)。通過引用可以修改引用所指向的變量的值。

  3. 引用不能引用空值或不存在的對(duì)象。

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

  5. 不能建立數(shù)組的引用。因?yàn)閿?shù)組是一個(gè)由若干個(gè)元素所組成的集合,所以無法建立一個(gè)數(shù)組的別名。


引用的特性與引用的使用

引用的使用
int main() {
    int x = 10;
    int& ref = x;//對(duì)x進(jìn)行引用

    cout << "x = " << x << endl; // 輸出 x = 10
    cout << "ref = " << ref << endl; // 輸出 ref = 10

    ref = 20; // 修改引用的目標(biāo)

    cout << "x = " << x << endl; // 輸出 x = 20
    cout << "ref = " << ref << endl; // 輸出 ref = 20

    return 0;
}

【C++】引用、內(nèi)聯(lián)函數(shù)、auto關(guān)鍵字等,高質(zhì)量C++的學(xué)習(xí),c++,開發(fā)語言


變量與引用的變量共用同一塊內(nèi)存空間
void TestRef()
{
    int a = 10;
    int& ra = a;//<====定義引用類型
    printf("%p\n", &a);
    printf("%p\n", &ra);
}

int main()
{
    TestRef();
    return 0;
}

【C++】引用、內(nèi)聯(lián)函數(shù)、auto關(guān)鍵字等,高質(zhì)量C++的學(xué)習(xí),c++,開發(fā)語言
此時(shí)我們也不難發(fā)現(xiàn),a和ra所在的空間上的地址是相同的,因此可以知道,a和ra共用同一塊內(nèi)存空間。
【C++】引用、內(nèi)聯(lián)函數(shù)、auto關(guān)鍵字等,高質(zhì)量C++的學(xué)習(xí),c++,開發(fā)語言


引用的特性

如果要博主解釋引用的話,博主目前短暫的理解是,引用如指針是十分相向的,但是引用一旦指向一個(gè)實(shí)體就不能改變其指向了。

  1. 引用在定義時(shí)必須初始化

  2. 一個(gè)變量可以有多個(gè)引用

  3. 引用一旦引用一個(gè)實(shí)體,再不能引用其他實(shí)體

int main()
{
	int a = 10;
	int& ra = a;
	//int& ra;此時(shí)會(huì)報(bào)錯(cuò),因?yàn)橐迷诙x的時(shí)候必須初始化
	int& rra = ra;//一個(gè)變量可以擁有多個(gè)引用
	cout << "原本的值" << endl;
	cout << "a = " << a << " ra = " << ra << " rra = " << rra << endl;//引用的變量與變量本身共用同一塊空間
	cout <<"地址: " << "a = " << &a << " ra = " << &ra << " rra = " << &rra << endl;

	cout << "修改后的值" << endl;
	a++;//對(duì)引用的修改是會(huì)影響變量本身的
	ra++;
	rra++;
	cout << "a = " << a << " ra = " << ra << " rra = " << rra << endl;
	cout << "地址: " << "a = " << &a << " ra = " << &ra << " rra = " << &rra << endl;
	return 0;
}

【C++】引用、內(nèi)聯(lián)函數(shù)、auto關(guān)鍵字等,高質(zhì)量C++的學(xué)習(xí),c++,開發(fā)語言


常引用

const這種方式聲明的引用,不能通過引用對(duì)目標(biāo)變量的值進(jìn)行修改,從而使引用的目標(biāo)成為const,達(dá)到了引用的安全性。和const修飾變量一樣,被const修飾的引用只能夠讀,而不能夠?qū)?,即不能修改引用變量的值。接下來我們將通過幾個(gè)例題來幫助我們理解,如下:

例1:請(qǐng)問如下兩個(gè)語句,哪一個(gè)會(huì)報(bào)錯(cuò),哪一個(gè)不會(huì)。

 const int a = 10;//語句1
 int& ra = a;  //語句2

代碼解讀:

在如上的兩個(gè)代碼中,語句1將10這個(gè)常量傳給了整型a,并且a無法被修改,因此語句1正確,而語句二,我們將一個(gè)無法被修改的a值傳給引用ra,此時(shí)我們不難發(fā)現(xiàn),如果ra可以這樣引用的話不就代表a值是可以修改的了嘛?那這個(gè)const修飾的a不就沒有任何意義了嘛?因此不難判斷出語句2是錯(cuò)誤的。因此正確的寫法是:const int& ra = a; 此時(shí)我們用const修飾的引用變量ra就可以達(dá)到該引用值無法被修改。


例題2:請(qǐng)問如下兩個(gè)語句,哪一個(gè)會(huì)報(bào)錯(cuò),哪一個(gè)不會(huì)。

int& b = 10; //語句1
const int& b = 10;//語句2

代碼解讀:

我們可以知道10是一個(gè)常量對(duì)吧,10能被修改嘛?當(dāng)然不可以,因此我們?cè)趺纯赡芸梢酝ㄟ^引用變量直接來引用10呢?這不開玩笑嘛,如果b能夠直接修改這個(gè)10,那10是什么表示呢?如果不懂的可以看下圖。那么語句2呢?我們用const修飾引用變量,那么此時(shí)被引用的變量就無法修改,因此語句2正確。

【C++】引用、內(nèi)聯(lián)函數(shù)、auto關(guān)鍵字等,高質(zhì)量C++的學(xué)習(xí),c++,開發(fā)語言


例題3:請(qǐng)問如下兩個(gè)語句,哪一個(gè)會(huì)報(bào)錯(cuò),哪一個(gè)不會(huì)。

 double d = 12.34;
 int& rd = d; //語句1
 const int& rd = d;//語句2

代碼解讀:

語句1直接對(duì)d進(jìn)行引用的同時(shí),在編譯器中會(huì)對(duì)d進(jìn)行強(qiáng)轉(zhuǎn)成一個(gè)整型12,而12具有常性因此如果我們直接對(duì)其進(jìn)行引用的過程中會(huì)導(dǎo)致我們墻面講到的情況,如果對(duì)一個(gè)常量直接引用會(huì)導(dǎo)致數(shù)據(jù)發(fā)生修改,因此我們需要加上const對(duì)其進(jìn)行修飾,如果不能理解可以看下圖。

【C++】引用、內(nèi)聯(lián)函數(shù)、auto關(guān)鍵字等,高質(zhì)量C++的學(xué)習(xí),c++,開發(fā)語言
整體代碼測試:

void TestConstRef()
{
    const int a = 10;
    //int& ra = a;   // 該語句編譯時(shí)會(huì)出錯(cuò),a為常量
    const int& ra = a;
    // int& b = 10; // 該語句編譯時(shí)會(huì)出錯(cuò),b為常量
    const int& b = 10;
    double d = 12.34;
    //int& rd = d; // 該語句編譯時(shí)會(huì)出錯(cuò),類型不同
    const int& rd = d;
    cout << "a = " << a << " ra = " << ra << " b =  " << b << " d = " << d << " rd = " << rd << endl;
}

int main()
{
    TestConstRef();
	return 0;
}

運(yùn)行結(jié)果
【C++】引用、內(nèi)聯(lián)函數(shù)、auto關(guān)鍵字等,高質(zhì)量C++的學(xué)習(xí),c++,開發(fā)語言


引用的使用場景

做參數(shù)

在學(xué)習(xí)C語言的過程中我們知道,如果將一個(gè)數(shù)傳遞給函數(shù),形參是實(shí)參的一份臨時(shí)拷貝,此時(shí)空間占用是十分大的,而引用本質(zhì)就是直接把該數(shù)本身傳遞過去,直接對(duì)這個(gè)數(shù)可以進(jìn)行修改省區(qū)了對(duì)該數(shù)進(jìn)行拷貝的過程減少了空間的消耗.
實(shí)例演示

void Swap(int& a, int& b)//此時(shí)我們直接用引用結(jié)接收
{
	int tmp = 0;
	tmp = a;
	a = b;
	b = tmp;
}

int main()
{
	int n = 3;
	int m = 4;
	cout <<"修改前: " << n << ' ' << m << endl;
	Swap(n, m);
	cout <<"修改后: " << n << ' ' << m << endl;
	return 0;
}

【C++】引用、內(nèi)聯(lián)函數(shù)、auto關(guān)鍵字等,高質(zhì)量C++的學(xué)習(xí),c++,開發(fā)語言

具體等作為參數(shù)的情況,我們?cè)诤竺娴膶W(xué)習(xí)會(huì)持續(xù)體會(huì)到的,到時(shí)候感受肯定是會(huì)與現(xiàn)在不太一樣,因此我們現(xiàn)在就對(duì)其做一個(gè)初步的使用即可.


做返回值

我們接下來依然通過幾個(gè)例子來幫助我們理解作為返回值的情況.
例1:

int& Func()
{
	static int n = 0;//static修飾的局部變量出了作用域不會(huì)結(jié)束
	n++;
	printf("&n:%p\n", &n);
	return n;
}

int main()
{
	int ret = Func();
	cout <<"n = "<< ret << endl;//查看此時(shí)n的地址與值
	int& rret = Func();
	printf("&rret:%p\n", &rret);
	return 0;
}

此時(shí)我們不難發(fā)現(xiàn)將引用作為返回值返回給了函數(shù)
【C++】引用、內(nèi)聯(lián)函數(shù)、auto關(guān)鍵字等,高質(zhì)量C++的學(xué)習(xí),c++,開發(fā)語言


例題2:

int& Add(int a, int b)
{
    static int c = a + b;
    return c;
}
int main()
{
    int& ret = Add(1, 2);
    cout << "Add(1, 2) is :" << ret << endl;
    int& m = Add(3, 4);
    cout << "Add(3, 4) is :" << m << endl;
    return 0;
}

代碼分析:
這里我們將1,2先傳過去因此一開始返回的是3沒有任何疑問,在第二次傳遞給3和4的時(shí)候我們需要注意達(dá)到是static修飾的局部變量出了作用域并不會(huì)結(jié)束,static修飾局部變量會(huì)進(jìn)行一次初始化,并且只會(huì)進(jìn)行一次,因此我們傳過去的3和4并沒有相加,返回的依然是上一次的結(jié)果3.
【C++】引用、內(nèi)聯(lián)函數(shù)、auto關(guān)鍵字等,高質(zhì)量C++的學(xué)習(xí),c++,開發(fā)語言


例題3:

int& Add(int a, int b)
{
    int c = a + b;
    return c;
}
int main()
{
    int& ret = Add(1, 2);
    cout << "Add(1, 2) is :" << ret << endl;
    Add(3, 4);
    cout << "Add(1, 2) is :" << ret << endl;
    return 0;
}

代碼分析:
在函數(shù) Add 中,局部變量 c 的生命周期僅限于函數(shù)內(nèi)部。
當(dāng)函數(shù)執(zhí)行完畢后,c 被銷毀,而返回的引用 ret 將指向一個(gè)不存在的對(duì)象。當(dāng)再次使用這個(gè)引用時(shí),就會(huì)出現(xiàn)未定義的行為。因?yàn)榇藭r(shí)我們又傳遞了3和4此時(shí)我們并沒有返回值接收,然后再次調(diào)用ret的時(shí)候所引用的就是3和4那塊函數(shù)所指向空間的值.
【C++】引用、內(nèi)聯(lián)函數(shù)、auto關(guān)鍵字等,高質(zhì)量C++的學(xué)習(xí),c++,開發(fā)語言
總結(jié)一下:出了函數(shù)作用域返回變量不存在了,不能用引用返回因?yàn)榇藭r(shí)指向的空間已經(jīng)被銷毀了可以理解成為一個(gè)野引用,因此出了函數(shù)作用域返向變量存在,才能用引用返回.

  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ì)更安全

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

C++內(nèi)聯(lián)函數(shù)是一種特殊的函數(shù),其函數(shù)體在調(diào)用點(diǎn)處直接展開,而不是按照函數(shù)調(diào)用的方式進(jìn)行執(zhí)行。這樣可以避免函數(shù)調(diào)用的開銷,提高程序的執(zhí)行效率。
在C++中,可以通過將函數(shù)定義放在函數(shù)聲明之前,并在函數(shù)聲明處加上關(guān)鍵字“inline”來定義內(nèi)聯(lián)函數(shù)

內(nèi)聯(lián)函數(shù)的特性

  1. inline是一種以空間換時(shí)間的做法,如果編譯器將函數(shù)當(dāng)成內(nèi)聯(lián)函數(shù)處理,在編譯階段,會(huì)
    用函數(shù)體替換函數(shù)調(diào)用,缺陷:可能會(huì)使目標(biāo)文件變大,優(yōu)勢:少了調(diào)用開銷,提高程序運(yùn)
    行效率。
  2. inline對(duì)于編譯器而言只是一個(gè)建議,不同編譯器關(guān)于inline實(shí)現(xiàn)機(jī)制可能不同,一般建議:將函數(shù)規(guī)模較小(即函數(shù)不是很長,具體沒有準(zhǔn)確的說法,取決于編譯器內(nèi)部實(shí)現(xiàn))
  3. inline不建議聲明和定義分離,分離會(huì)導(dǎo)致鏈接錯(cuò)誤。因?yàn)閕nline被展開,就沒有函數(shù)地址了,鏈接就會(huì)找不到

內(nèi)聯(lián)函數(shù)的限制和注意事項(xiàng)

  1. 內(nèi)聯(lián)函數(shù)的定義必須在每個(gè)使用該函數(shù)的文件中可見。
  2. 內(nèi)聯(lián)函數(shù)一般放在頭文件中,以便在多個(gè)源文件中使用。
  3. 內(nèi)聯(lián)函數(shù)不應(yīng)包含復(fù)雜的邏輯或大量的代碼,以避免代碼膨脹。
  4. 對(duì)于遞歸函數(shù)、帶有循環(huán)或開銷較大的函數(shù),不建議使用內(nèi)聯(lián)函數(shù)。

實(shí)例演示:

inline int add(int a, int b) //內(nèi)聯(lián)函數(shù)的定義
{
	return a + b;
}

int main()
{
	cout << add(19, 21) << endl;
	return 0;
}

【C++】引用、內(nèi)聯(lián)函數(shù)、auto關(guān)鍵字等,高質(zhì)量C++的學(xué)習(xí),c++,開發(fā)語言


auto 關(guān)鍵字在C語言中就已經(jīng)存在了,只不過在C語言中它的作用是聲明自動(dòng)變量:auto int a = 0;
在C++中,關(guān)鍵字auto用于自動(dòng)推導(dǎo)變量的類型。它可以讓編譯器根據(jù)變量初始化表達(dá)式的類型自動(dòng)推導(dǎo)出該變量的類型,從而簡化變量類型的聲明和初始化過程

使用auto關(guān)鍵字有以下幾點(diǎn)注意事項(xiàng):

  1. auto關(guān)鍵字只能在變量的聲明和初始化過程中使用,不能用于函數(shù)的返回類型、函數(shù)參數(shù)類型、類成員的類型等。
  2. auto關(guān)鍵字通常用于推導(dǎo)變量的類型,不適用于推導(dǎo)引用或指針的類型。如果需要推導(dǎo)引用或指針的類型,可以使用auto&或auto*。
  3. 推導(dǎo)出的變量類型與表達(dá)式的類型是一致的,包括const、引用、指針等限定符。
  4. auto關(guān)鍵字在編譯時(shí)自動(dòng)推導(dǎo)變量類型,而不是在運(yùn)行時(shí)進(jìn)行類型推導(dǎo)。
    實(shí)例演示:
void func(int a, int b)
{
	//.....
	//.....
}

int main()
{
	int i = 0;
	int j = i;
	auto k = i;//auto可以通過右邊的類型自動(dòng)推導(dǎo)左邊的類型
	auto p1 = &i;
	void(*pf1)(int, int) = func;//函數(shù)指針
	auto pf1 = func;//用auto直接直接識(shí)別
}
基于范圍的for循環(huán)(C++11)

在C++98中如果要遍歷一個(gè)數(shù)組,可以按照以下方式進(jìn)行:

void TestFor()
{
int array[] = { 1, 2, 3, 4, 5 };
for (int i = 0; i < sizeof(array) / sizeof(array[0]); ++i)
     array[i] *= 2;
for (int* p = array; p < array + sizeof(array)/ sizeof(array[0]); ++p)
     cout << *p << endl;
}

對(duì)于一個(gè)有范圍的集合而言,由程序員來說明循環(huán)的范圍是多余的,有時(shí)候還會(huì)容易犯錯(cuò)誤。因此C++11中引入了基于范圍的for循環(huán)。for循環(huán)后的括號(hào)由冒號(hào)“ :”分為兩部分:第一部分是范圍內(nèi)用于迭代的變量,第二部分則表示被迭代的范圍。ps:目前我們只講怎么用即可,以后會(huì)給大家詳細(xì)講解
實(shí)例演示:

int main()
{
	for (auto e : array)//依次取數(shù)組中的值賦值給e,自動(dòng)迭代,自動(dòng)判斷結(jié)束
	{
		cout << e << " ";
	}
}	

【C++】引用、內(nèi)聯(lián)函數(shù)、auto關(guān)鍵字等,高質(zhì)量C++的學(xué)習(xí),c++,開發(fā)語言

int main()
{
	for (auto& e : array)//e是對(duì)數(shù)組里面的值的拷貝,所以無法直接賦值,得引用
	{
		e *= 2;
	}
	for (auto e : array)
	{
		cout << e << " ";
	}
}

【C++】引用、內(nèi)聯(lián)函數(shù)、auto關(guān)鍵字等,高質(zhì)量C++的學(xué)習(xí),c++,開發(fā)語言


指針空值nullptr(C++11)

在這里我們只需要知道nullptr是替代原本的NULL即可

在C++中,nullptr是一種特殊的空指針常量。它被用來表示一個(gè)空指針,即指向沒有任何對(duì)象的指針。
在早期的C++版本中,常常使用NULL來表示空指針。然而,NULL實(shí)際上是一個(gè)宏定義,一般被定義為整數(shù)0。這樣的定義使得在一些情況下,NULL可能會(huì)被誤用。
為了解決這個(gè)問題,C++11引入了nullptr。nullptr是一個(gè)關(guān)鍵字,用來表示空指針,不會(huì)被隱式地轉(zhuǎn)換成其他類型。使用nullptr可以提高代碼的可讀性和安全性.總而言之,nullptr是C++11中用來表示空指針的關(guān)鍵字,相對(duì)于早期的NULL常量,nullptr更加安全和可讀性更好.


好啦,今天的內(nèi)容就到這里啦,下期內(nèi)容預(yù)告類和對(duì)象


結(jié)語:今天的內(nèi)容就到這里吧,謝謝各位的觀看,如果有講的不好的地方也請(qǐng)各位多多指出,作者每一條評(píng)論都會(huì)讀的,謝謝各位。文章來源地址http://www.zghlxwxcb.cn/news/detail-828373.html


????? 這里祝各位寒假愉快 ????

到了這里,關(guān)于【C++】引用、內(nèi)聯(lián)函數(shù)、auto關(guān)鍵字等的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(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)紅包