最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++類與對象深入之引用與內(nèi)聯(lián)函數(shù)與auto關(guān)鍵字及for循環(huán)詳解

 更新時間:2022年06月10日 09:52:34   作者:Rookiep  
朋友們好,這篇播客我們繼續(xù)C++的初階學(xué)習(xí),現(xiàn)在對一些C++的入門知識做了些總結(jié),整理出來一篇博客供我們一起復(fù)習(xí)和學(xué)習(xí),如果文章中有理解不當(dāng)?shù)牡胤?還希望朋友們在評論區(qū)指出,我們相互學(xué)習(xí),共同進(jìn)步

一:引用

1.1:概念

引用不是定義一個新的變量,而是給已經(jīng)存在的變量取一個別名。注意:編譯器不會給引用變量開辟內(nèi)存空間,他和他的引用變量共用同一塊內(nèi)存空間。

類型& 引用變量名(對象名) = 引用實(shí)體。

1.2:引用特性

1. 引用在定義時必須初始化

2. 一個變量可以有多個引用

3. 引用一旦引用一個實(shí)體,也就不能引用其他實(shí)體

通俗的講就是:我們?nèi)⊥馓?,肯定是對一個對象取外號,不可能是這空氣取外號,而且也可以給同一個人取多個外號,但是同一個外號我們就不要給多個人取了,那樣就亂套了,就不知道叫的是誰了。

1.3:常引用

原則:對原引用變量,權(quán)限只能縮小,不能放大。

int main(){
		const int x = 20;
		//int& y = x;       // 放大
		const int& y = x;   // 不變
		int c = 30;
		const int& d = c;  // 縮小
		//cout << d << endl;
	system("pause");
	return 0;
}

對常變量取別名時,要加const;

const int & b = 10;

注意:當(dāng)引用類型和引用實(shí)體不是同一類型時,如:

double a = 3.14;
//int &ra = a; //該編譯語句會報錯,因?yàn)轭愋筒煌?
const int & ra = a;
//加上const就可以了。

我們可以這么理解,當(dāng)浮點(diǎn)型轉(zhuǎn)換整型數(shù)據(jù)時,其中我們在C語言學(xué)過會發(fā)生隱式類型轉(zhuǎn)換,在轉(zhuǎn)換的時候會產(chǎn)生一個臨時變量,這個臨時變量具有常性,不可以被修改,如果不加const,那么權(quán)限被放大,所以需要加上const保證他的權(quán)限不變。

其實(shí)現(xiàn)在ra的地址已經(jīng)不再是原變量a的地址了,是其中臨時變量的地址。

1.4:使用場景

做參數(shù):

void Swap(int& x, int& y)
{
	int tmp = x;
	x = y;
	y = tmp;
}
void Swap(double& x, double& y)
{
	double tmp = x;
	x = y;
	y = tmp;
}

做返回值 下面我們先看兩個代碼

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

Add(1, 2) is :3
//請按任意鍵繼續(xù). . . 

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

Add(1, 2) is :7
//請按任意鍵繼續(xù). . .

都一個結(jié)果是3,第二個結(jié)果是7,為什么會這樣呢?

我們知道在函數(shù)返回值時實(shí)際是產(chǎn)生一個臨時變量,若傳值返回,那么實(shí)際是發(fā)生了拷貝,若引用返回,那么其實(shí)是給這個臨時變量取了別名,返回了這個臨時變量的別名。 對于靜態(tài)變量c的作用域不變,但是生命周期變長,在Add函數(shù)返回時,出了作用域,返還對象并沒有還給系統(tǒng),所以此時ret一直是第一次調(diào)用Add函數(shù)時產(chǎn)生的臨時變量的別名,所以ret的結(jié)果是3。

1.5:引用和指針的區(qū)別

在語法概念上,引用就是一個別名,沒有開辟獨(dú)立的空間存儲,和其引用實(shí)體共用同一塊實(shí)體。

int main(){
	int a = 10;
	int & ra = a;
	cout << "&a = " << &a << endl;
	cout << "&ra = " << &ra << endl;
	system("pause");
	return 0;
}

&a = 0137F8D8
&ra = 0137F8D8
請按任意鍵繼續(xù). . .

由代碼結(jié)果可看是同一塊地址。

在底層實(shí)現(xiàn)上實(shí)際是有空間的,因?yàn)橐檬前凑罩羔樂绞絹韺?shí)現(xiàn)的。

引用和指針的不同點(diǎn):

  • 引用在定義時必須初始化,指針沒有要求。
  • 引用在初始化時引用一個實(shí)體后,就不能再引用其他實(shí)體,而指針可以在任何時候指向任何一個同類型實(shí)體。
  • 沒有NULL引用,但是有NULL指針。
  • sizeof中含義不同:引用結(jié)果為引用類型的大小,但指針始終是地址空間所占字節(jié)個數(shù)。
  • 引用自加即引用的實(shí)體增加1,指針自加即指針向后偏移一個類型的大小。
  • 有多級指針,但沒有多級引用。
  • 訪問實(shí)體不同,指針需要顯式解引用,引用編譯器自己處理。
  • 引用比指針使用起來更加安全。

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

2.1:概念

以inline修飾的函數(shù)叫做內(nèi)聯(lián)函數(shù),用于解決C語言中宏函數(shù)難懂易錯的缺陷。在編譯時C++編譯器會在調(diào)用內(nèi)聯(lián)函數(shù)的地方展開,沒有函數(shù)壓棧的開銷,內(nèi)聯(lián)函數(shù)提升程序運(yùn)行的效率。

如果在上述函數(shù)前增加inline關(guān)鍵字,將其改成內(nèi)聯(lián)函數(shù),那么在編譯期間編譯器會用函數(shù)體(展開)替換函數(shù)的調(diào)用。

查看方式:

在Release模式下,查看編譯器生成的匯編代碼中是否有call Add

在Debug模式下,需要對編譯器進(jìn)行設(shè)置,否則也不會展開。

如VS2013版本設(shè)置:

右擊項(xiàng)目名稱——>屬性:

2.2:特性

  • inline是一種以空間換取時間的做法,利用直接展開函數(shù)省去調(diào)用函數(shù)的開銷。所以對于代碼很長或者有循環(huán)/遞歸的函數(shù)不方便使用作為內(nèi)聯(lián)函數(shù)。
  • inline對于編譯器而言只是一個建議,編譯器會自動優(yōu)化,如果定義的inline的函數(shù)體內(nèi)有循環(huán)/遞歸等,編譯器優(yōu)化時會忽略掉內(nèi)聯(lián)。
  • inline不建議聲明和定義分開,分開會導(dǎo)致鏈接錯誤,因?yàn)閕nline被展開,就沒有函數(shù)地址了,如果分開了,鏈接的時候就找不到了。

2.3:面試題

宏的優(yōu)點(diǎn)?

  • 增強(qiáng)代碼的復(fù)用性
  • 提高性能

缺點(diǎn):

  • 不方便調(diào)試,因?yàn)榫幾g階段進(jìn)行了宏替換。
  • 導(dǎo)致代碼可讀性差,可維護(hù)性差,容易誤用。
  • 沒有類型安全檢查。

C++哪些技術(shù)可以替代宏?

  • 常量定義,換用const。
  • 函數(shù)定義,換用內(nèi)聯(lián)函數(shù)。

三:auto關(guān)鍵字

3.1:auto簡介

我們在學(xué)習(xí)C語言的時候就見過auto,當(dāng)時認(rèn)為使用auto修飾的變量是具有自動存儲器的局部變量,但我們幾乎沒有使用。

在C++11中,標(biāo)準(zhǔn)委員會賦予了auto全新的含義:auto不再是一個存儲類型標(biāo)識符,而是作為一個新的類型指示符來指示編譯器,auto聲明的變量必須由編譯器在編譯時期推導(dǎo)而得。

int TestAuto()
{
	return 10;
}
int main()
{
	const int a = 10;
	auto b = &a;
	auto c = 'a';
	auto d = TestAuto();
	cout << typeid(b).name() << endl;
	cout << typeid(c).name() << endl;
	cout << typeid(d).name() << endl;
	return 0;
}

這里我們看打印的結(jié)果是:

int const *
char
int
請按任意鍵繼續(xù). . .

可見auto關(guān)鍵字可以自動識別變量的類型。這里**typeid(b).name()**可返回變量類型的字符串。

【注意】:使用auto關(guān)鍵字定義變量時,必須對其初始化,在編譯階段編譯器需要根據(jù)初始化表達(dá)式來推導(dǎo)auto的實(shí)際類型。因此auto并非是一種類型的聲明,而是一種類型聲明時的占位符,編譯器在編譯期間會將auto替換為變量實(shí)際類型。

3.2:auto使用細(xì)則

auto與指針和引用結(jié)合使用

用auto聲明指針類型時,用auto和auto*沒有任何區(qū)別,但是用auto聲明引用類型時則必須加&。

int main()
{
	int x = 10, y = 20;
	auto a = &x;
	auto* b = &x;
	auto& c = x;
	cout << typeid(a).name() << endl;
	cout << typeid(b).name() << endl;
	cout << typeid(c).name() << endl;
	*a = 20;
	*b = 30;
	c = 40;
	system("pause");
	return 0;
}

int *
int *
int
請按任意鍵繼續(xù). . .

看這里a和b的類型都是int * ,所以用auto聲明指針類型時,用auto和auto*沒有任何區(qū)別。

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

注意看d下面編譯器報錯了,因?yàn)閏和d的初始化表達(dá)式類型不同。

3.3:auto不能推導(dǎo)的場景

1:auto不可以作為函數(shù)形參

因?yàn)樵谛螀⑻幨褂胊uto,編譯器無法對a的實(shí)際類型進(jìn)行推導(dǎo)。

2:auto不可以用來聲明數(shù)組。

四:基于范圍的for循環(huán)

4.1:范圍for循環(huán)的語法

對于一個有范圍的集合而言,在C++98中由程序員來說明循環(huán)的范圍是多余的,有時候還容易犯錯。因此在C++11中引入基于范圍的for循環(huán)。for循環(huán)后的括號由冒號“:”分為兩部分。第一部分是范圍內(nèi)用于迭代的變量,第二部分則是表示被迭代的范圍。

int main(){
	int array[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9};
	for (int i = 0; i < sizeof(array) / sizeof(int); ++i){
		array[i] *= 2;
	}
	for (int i = 0; i < sizeof(array) / sizeof(int); ++i){
		cout << array[i] << " ";
	}
	cout << endl;
	// 范圍for
	// 依次自動取array中的數(shù)據(jù),賦值給e,自動判斷結(jié)束
	for (auto& e : array){
		e /= 2;
	}
	for (auto x : array){
		cout << x << " ";
	}
	cout << endl;
	system("pause");
	return 0;
}

2 4 6 8 10 12 14 16 18
1 2 3 4 5 6 7 8 9
請按任意鍵繼續(xù). . .

對于語句auto x : array意思是依次自動取array中的數(shù)據(jù),賦值給e,所以相當(dāng)于e是array中的拷貝,既然是拷貝,也就不能對array中的數(shù)據(jù)產(chǎn)生影響。對要改變array中數(shù)據(jù),需要利用引用,正如代碼中auto& e : array。

4.2:范圍for循環(huán)的使用條件

for循環(huán)迭代的范圍必須是確定的。

下面給出一個錯誤代碼示例:

void TestFor(int array[])
{
	for (auto& e : array)
		cout << e << endl;
}

因?yàn)槲覀冎?,函?shù)傳參,形參相對于實(shí)參發(fā)生降維,形參array是一個整型指針,所以這里for循環(huán)的迭代范圍是不確定的。

到此這篇關(guān)于C++類與對象深入之引用與內(nèi)聯(lián)函數(shù)與auto關(guān)鍵字及for循環(huán)詳解的文章就介紹到這了,更多相關(guān)C++類與對象內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • c++實(shí)現(xiàn)廣播通訊詳解

    c++實(shí)現(xiàn)廣播通訊詳解

    這篇文章主要為大家詳細(xì)介紹了c++實(shí)現(xiàn)廣播通訊的相關(guān)知識,文中的示例代碼講解詳細(xì),具有一定的借鑒價值,有需要的小伙伴可以參考一下
    2024-12-12
  • C語言中memcpy 函數(shù)的用法詳解

    C語言中memcpy 函數(shù)的用法詳解

    這篇文章主要介紹了C語言中memcpy 函數(shù)的用法詳解的相關(guān)資料,需要的朋友可以參考下
    2017-07-07
  • 一篇文章帶你了解C語言的選擇結(jié)構(gòu)

    一篇文章帶你了解C語言的選擇結(jié)構(gòu)

    這篇文章主要為大家介紹了C語言的選擇結(jié)構(gòu),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • 使用Matlab實(shí)現(xiàn)錄音與播放功能

    使用Matlab實(shí)現(xiàn)錄音與播放功能

    這篇文章主要為大家詳細(xì)介紹了如何使用Matlab實(shí)現(xiàn)錄音與播放功能,文中的示例代碼簡潔易懂,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-12-12
  • C++實(shí)現(xiàn)簡單迷宮游戲

    C++實(shí)現(xiàn)簡單迷宮游戲

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)簡單迷宮游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-01-01
  • C++設(shè)計(jì)模式之裝飾模式

    C++設(shè)計(jì)模式之裝飾模式

    這篇文章主要介紹了C++設(shè)計(jì)模式之裝飾模式,裝飾模式能夠?qū)崿F(xiàn)動態(tài)的為對象添加功能,是從一個對象外部來給對象添加功能,需要的朋友可以參考下
    2014-10-10
  • C語言之素數(shù)(質(zhì)數(shù))的判斷以及輸出

    C語言之素數(shù)(質(zhì)數(shù))的判斷以及輸出

    這篇文章主要介紹了C語言之素數(shù)(質(zhì)數(shù))的判斷以及輸出方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • C語言 模擬實(shí)現(xiàn)strcpy與strcat函數(shù)詳解

    C語言 模擬實(shí)現(xiàn)strcpy與strcat函數(shù)詳解

    這篇文章主要介紹了怎樣用C語言模擬實(shí)現(xiàn)strcpy與strcat函數(shù),strcpy()函數(shù)是C語言中的一個復(fù)制字符串的庫函數(shù),strcat()函數(shù)的功能是實(shí)現(xiàn)字符串的拼接
    2022-04-04
  • C++字符串反轉(zhuǎn)的幾種方法

    C++字符串反轉(zhuǎn)的幾種方法

    通過不同的方法,實(shí)現(xiàn)對所輸入字符串的反轉(zhuǎn),具有一定的參考價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-06-06
  • C++ 類的繼承與派生實(shí)例詳解

    C++ 類的繼承與派生實(shí)例詳解

    這篇文章主要介紹了 C++ 類的繼承與派生實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-06-06

最新評論

广河县| 竹山县| 微山县| 新和县| 司法| 新泰市| 鸡西市| 台北市| 泸水县| 柳河县| 兰溪市| 福州市| 丰都县| 垫江县| 梁平县| 泰和县| 宾川县| 黄平县| 明光市| 柘荣县| 溧水县| 桐乡市| 宾阳县| 锡林郭勒盟| 汉中市| 普格县| 竹山县| 营口市| 毕节市| 乳山市| 隆德县| 昌都县| 启东市| 腾冲县| 安阳县| 巴马| 黑水县| 常熟市| 都匀市| 左权县| 茌平县|