欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

一文詳解C++中的引用與關(guān)鍵字auto

 更新時(shí)間:2023年04月20日 09:32:43   作者:匿名者Unit  
引用就是給一個(gè)已經(jīng)存在的變量取一個(gè)別名,與變量共用一段內(nèi)存空間。關(guān)鍵字auto一般可以用來(lái)自動(dòng)識(shí)別類(lèi)型,本文主要來(lái)講講二者的相關(guān)知識(shí),需要的可以參考一下

一.引用

1.引用的概念

引用就是給一個(gè)已經(jīng)存在的變量取一個(gè)別名,與變量共用一段內(nèi)存空間。注意引用的類(lèi)型必須和變量類(lèi)型相同,來(lái)演示下引用如何使用。

#include <iostream>
using namespace std;

int main()
{
	int a = 1;
	int& b = a;
	int& c = b;
	int& d = c;
	
	cout << &a << endl;
	cout << &b << endl;
	cout << &c << endl;
	cout << &d << endl;

	return 0;
}

如上面的代碼所示:我們給a取了個(gè)別名b,給b取別名c…也就是b是a的引用,c是b的引用…。其實(shí)b,c,d都代表著a,它們都共用著一塊內(nèi)存空間。

如下圖所示:

2.引用的使用和問(wèn)題

引用的注意事項(xiàng):

  • 引用必須初始化
  • 引用不能更改
  • 一個(gè)變量可以有多個(gè)引用

引用可以作為函數(shù)的參數(shù)也可以做返回值,在之前學(xué)習(xí)C語(yǔ)言我們常使用指針傳參,也就是傳址調(diào)用來(lái)改變外部變量的值。學(xué)習(xí)引用后,我們只用引用傳參就會(huì)特別方便。

當(dāng)返回引用時(shí),就會(huì)引出很多問(wèn)題,這里我們來(lái)解析下下面的代碼:

int& Add()
{
	int n = 0;//靜態(tài)變量static int a = 0;
	n++;

	return n;
}

int main()
{
	int ret=Add();
	cout << ret << endl;
	return 0;
}

n在Add函數(shù)中變?yōu)?,Add返回了n的引用,我們用變量ret來(lái)接收n的引用也就是n的值,但是有個(gè)問(wèn)題就是——n在出Add函數(shù)后,函數(shù)棧幀如果被清理的話(huà),函數(shù)返回引用找到的值就會(huì)是隨機(jī)值。如果棧幀沒(méi)有被清理,那ret僥幸是正確的1。為了避免這種情況我們可以將Add函數(shù)的n設(shè)為靜態(tài)變量。

為了驗(yàn)證,我們?cè)倏匆幌旅娴拇a:

int& Add(int x)
{
	int n = x;
	n++;
	return n;
}

int main()
{
	int& ret=Add(10);
	cout << ret << endl;

	Add(20);
	rand();
	cout << ret << endl;
	return 0;
}

假設(shè)出Add函數(shù)后棧幀不破壞那打印結(jié)果就是11\n21,但是我們調(diào)用個(gè)函數(shù),模擬函數(shù)棧幀破壞的情況,那結(jié)果是不是像我們預(yù)想的那樣為隨機(jī)值呢。

總結(jié)

引用傳參適合大部分的情況

將引用返回值時(shí)需要注意引用對(duì)象還是否出函數(shù)是否還存在。

下面我們來(lái)看引用使用場(chǎng)景及其優(yōu)點(diǎn):

1.引用做參數(shù)-(輸出型參數(shù))

2.引用做參數(shù)-(減少拷貝提高效率) (大對(duì)象/深拷貝類(lèi)對(duì)象)

3.引用做返回值-(減少拷貝提高效率) (大對(duì)象/深拷貝類(lèi)對(duì)象)

4.引用做返回值-修改返回值+獲取返回值

接下來(lái)再講一下常引用、引用權(quán)限的放大、縮小、平移:

int func()
{
	stctic int a=0;
	a++;
	return a;
}
int main()
{
	//引用的權(quán)限可以平移和縮小不可以放大
	int a = 0;
	int& b = a;//平移
	const int& c = a;//縮小
	++a;
	++c;//放大


	const int a = 10;
	int& b = a;//只能給變量取別名

	double c = 3.14;
	int& d = c;//引用的類(lèi)型需要匹配
	const int& e = c;//類(lèi)型轉(zhuǎn)換會(huì)創(chuàng)建臨時(shí)變量 臨時(shí)變量具有常量性質(zhì)

	int& ret=func();//權(quán)限放大
	return 0;
}

語(yǔ)法層面上引用不會(huì)開(kāi)空間知識(shí)對(duì)變量取得一個(gè)別名,而從底層匯編指令來(lái)看的話(huà)引用是類(lèi)似指針的方式使用的。

3.引用與指針的比較

引用和指針有許多不同點(diǎn):

  • 引用需要初始化,指針不要求
  • 引用不能修改,指針可以
  • 有空指針,沒(méi)有空引用
  • 引用更為安全,指針可能出現(xiàn)野指針和越界等情況
  • 在sizeof中引用是類(lèi)型的字節(jié)大小,指針是根據(jù)機(jī)器位數(shù)來(lái)判斷字節(jié)個(gè)數(shù)
  • 引用在語(yǔ)法上定義一個(gè)變量的別名,指針儲(chǔ)存一個(gè)變量的地址
  • 有多級(jí)指針沒(méi)有多級(jí)引用
  • 指針需要根據(jù)地址解引用訪(fǎng)問(wèn),引用是編譯器自己處理的

二.關(guān)鍵字auto

auto可以自動(dòng)識(shí)別類(lèi)型,當(dāng)類(lèi)型過(guò)于復(fù)雜冗長(zhǎng)時(shí),auto使用起來(lái)非常的方便。

int main()
{
    int a = 1;
    auto b = 10;
    auto c = 3.14;
}

在同一行定義多個(gè)變量時(shí),需要注意同一行的變量類(lèi)型要一致,不然auto無(wú)法正確識(shí)別:

int main()
{
    auto a = 1, b = 2; 
     auto c = 3, d = 4.0;//類(lèi)型不同
}

auto還不能作為函數(shù)的參數(shù)以及定義數(shù)組

auto還有個(gè)重要的應(yīng)用——范圍for循環(huán)

他提供了一種更簡(jiǎn)便的for遍歷的方法根據(jù)冒號(hào)”:”分為兩部分:第一部分是范圍內(nèi)用于迭代的變量,第二部分則表示迭代的范圍。

int main()
{

	int arr[] = { 0,1,2,3,4,5,6 };

	for (auto x : arr)
		cout << x << endl;
}

以上就是一文詳解C++中的引用與關(guān)鍵字auto的詳細(xì)內(nèi)容,更多關(guān)于C++引用與關(guān)鍵字auto的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C++ Array容器的顯示和隱式實(shí)例化詳細(xì)介紹

    C++ Array容器的顯示和隱式實(shí)例化詳細(xì)介紹

    這篇文章主要介紹了C++中Array容器的隱式實(shí)例化和顯式實(shí)例化,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧
    2022-10-10
  • C++函數(shù)三種傳參形式(指針傳遞、引用傳遞、值傳遞)

    C++函數(shù)三種傳參形式(指針傳遞、引用傳遞、值傳遞)

    不論是哪種參數(shù)傳遞方式,都有形參和實(shí)參之分,本文主要介紹了C++函數(shù)三種傳參形式(指針傳遞、引用傳遞、值傳遞),具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-03-03
  • Linux系統(tǒng)下如何使用C++解析json文件詳解

    Linux系統(tǒng)下如何使用C++解析json文件詳解

    JSON(JavaScript Object Notation, JS 對(duì)象簡(jiǎn)譜) 是一種輕量級(jí)的數(shù)據(jù)交換格式。下面這篇文章主要給大家介紹了關(guān)于Linux系統(tǒng)下如何使用C++解析json文件的相關(guān)資料,需要的朋友可以參考下
    2021-06-06
  • C++設(shè)計(jì)模式編程中的觀(guān)察者模式使用示例

    C++設(shè)計(jì)模式編程中的觀(guān)察者模式使用示例

    這篇文章主要介紹了C++設(shè)計(jì)模式編程中的觀(guān)察者模式使用示例,觀(guān)察者模式在被觀(guān)察者和觀(guān)察者之間建立一個(gè)抽象的耦合,需要的朋友可以參考下
    2016-03-03
  • C++詳細(xì)講解繼承與虛繼承實(shí)現(xiàn)

    C++詳細(xì)講解繼承與虛繼承實(shí)現(xiàn)

    這篇文章主要介紹了Java中的繼承詳情,繼承是面向?qū)ο笕筇卣髦?,可以使得子?lèi)具有父類(lèi)的屬性和方法,還可以在子類(lèi)中重新定義,以及追加屬性和方法,下文介紹需要的朋友可以參考下
    2022-04-04
  • C++中的局部變量、全局變量、局部靜態(tài)變量、全局靜態(tài)變量的區(qū)別

    C++中的局部變量、全局變量、局部靜態(tài)變量、全局靜態(tài)變量的區(qū)別

    本文主要介紹了C++中的局部變量、全局變量、局部靜態(tài)變量、全局靜態(tài)變量的區(qū)別。具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧
    2017-02-02
  • C++的拷貝構(gòu)造函數(shù)你了解嗎

    C++的拷貝構(gòu)造函數(shù)你了解嗎

    這篇文章主要為大家詳細(xì)介紹了C++的拷貝構(gòu)造函數(shù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-03-03
  • C語(yǔ)言中的sscanf()函數(shù)使用

    C語(yǔ)言中的sscanf()函數(shù)使用

    本文主要介紹了C語(yǔ)言中的sscanf()函數(shù)使用,sscanf通常被用來(lái)解析并轉(zhuǎn)換字符串,可以實(shí)現(xiàn)很強(qiáng)大的字符串解析功能,下面就一起來(lái)了解一下
    2023-05-05
  • C語(yǔ)言中的結(jié)構(gòu)體快排算法

    C語(yǔ)言中的結(jié)構(gòu)體快排算法

    這篇文章主要介紹了C語(yǔ)言中的結(jié)構(gòu)體快排算法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • C調(diào)用C++代碼的方法步驟

    C調(diào)用C++代碼的方法步驟

    本文主要介紹了C調(diào)用C++代碼的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11

最新評(píng)論