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

【C++初階】引用&內(nèi)聯(lián)函數(shù)&auto關(guān)鍵字&范圍for循環(huán)&nullptr

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

=========================================================================

個(gè)人主頁還有更多系列專欄:小白不是程序媛

我的小倉庫:Gitee

C++系列專欄:C++頭疼記

=========================================================================

目錄

前言

引用

概念

引用的特點(diǎn)

常引用?

引用的使用場(chǎng)景

做參數(shù)

?做返回值

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

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

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

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

?編輯

內(nèi)聯(lián)函數(shù)的特點(diǎn)

auto關(guān)鍵字

概念

auto使用細(xì)則

范圍for循環(huán)

for范圍的使用條件

指針空值nullptr


前言

從上篇文章我們開始分享C++的一些入門基礎(chǔ)知識(shí),講到了關(guān)鍵字、命名空間等一些基礎(chǔ)問題,今天我們繼續(xù)分享一些基礎(chǔ)知識(shí),讓大家更深入的入門C++。


引用

  • 概念

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

就比如叫你有時(shí)稱呼你朋友的并不會(huì)使用他的大名,而是使用他的外號(hào),雖然兩個(gè)稱呼不一樣但是都指的是同一個(gè)人。

  • 實(shí)例

在C++中我們使用 & 符號(hào)來完成引用操作

int main()
{
	int a = 10;
	int& b = a;
	cout << a << endl;
	cout << b << endl;
	return 0;
}

【C++初階】引用&內(nèi)聯(lián)函數(shù)&auto關(guān)鍵字&范圍for循環(huán)&nullptr,C++頭疼記,c++,開發(fā)語言

注意:引用類型必須和引用實(shí)體時(shí)同種類型的

  • 引用的特點(diǎn)

  1. ?引用在定義時(shí)必須初始化
  2. ?一個(gè)變量可以有多個(gè)引用
  3. 引用一旦引用一個(gè)實(shí)體,再不能引用其他實(shí)體
//引用的特點(diǎn)
int main()
{
	int a = 10;
	//int& ra;
	//不可以空引用
	int& ra = a;
	int& rra = a;
	cout << a << endl;
	cout << ra << endl;
	cout << rra << endl;
	//一個(gè)實(shí)體可以有多個(gè)引用
	int b = 1;
	 ra = b;
	cout << a << endl;
	cout << ra << endl;
	//引用一旦引用了一個(gè)實(shí)體,就再也不可以引用其他實(shí)體,否則會(huì)改變?cè)纫脤?shí)體的值
	return 0;
}
  • 常引用?

const和引用配合使用時(shí)的注意點(diǎn)

//常引用
int main()
{
	const int a = 10;
	//int& ra = a;
	const int& ra = a;
	//a是常量,直接引用,會(huì)報(bào)錯(cuò) 要使用const修飾 引用
	
	//int& b = 10;
	const int& b = 10;
	//直接引用10會(huì)報(bào)錯(cuò),因?yàn)?0是常量,需要用const修飾引用

	double c = 3.14;
	//int& rc = c;
	double& rc = c;
	//引用類型一定要相同
	const int& rrc = c;
	//隱式類型提升 并不是對(duì)c進(jìn)行提升而是會(huì)產(chǎn)生一個(gè)臨時(shí)變量

	return 0;
}
  • 引用的使用場(chǎng)景

做參數(shù)

//做參數(shù)
int add(int& a, int& b)
{
	return a + b;
}
int main()
{
	int a = 10;
	int b = 30;
	cout << add(a, b) << endl;
	return 0;
}

?做返回值

//做返回值
int& count()
{
	static int n = 10;
	n++;
	return n;

}
int main()
{
	cout << count() << endl;
	return 0;
}

【C++初階】引用&內(nèi)聯(lián)函數(shù)&auto關(guān)鍵字&范圍for循環(huán)&nullptr,C++頭疼記,c++,開發(fā)語言

我們來看看下面的代碼

//經(jīng)典的錯(cuò)誤標(biāo)準(zhǔn)的零分
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;
	return 0;
}

?【C++初階】引用&內(nèi)聯(lián)函數(shù)&auto關(guān)鍵字&范圍for循環(huán)&nullptr,C++頭疼記,c++,開發(fā)語言

你們可以在自己的電腦上面嘗試運(yùn)行這段代碼看看運(yùn)行結(jié)果。

這里的運(yùn)行結(jié)果為7或者隨機(jī)值。我們的c沒有被static修飾函數(shù)調(diào)用完成后,會(huì)銷毀棧幀n會(huì)丟失,有的編譯器會(huì)清理數(shù)據(jù),有的不會(huì),因此會(huì)產(chǎn)生上面的情況。

【C++初階】引用&內(nèi)聯(lián)函數(shù)&auto關(guān)鍵字&范圍for循環(huán)&nullptr,C++頭疼記,c++,開發(fā)語言

注意:

如果函數(shù)返回時(shí),出了函數(shù)作用域,如果返回對(duì)象還在(還沒還給系統(tǒng)),則可以使用
引用返回,如果已經(jīng)還給系統(tǒng)了,則必須使用傳值返回。

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

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

//引用和實(shí)體公用一塊空間
int main()
{
	int a = 10;
	int& ra = a;
	cout << "&a= " << &a << endl;
	cout <<"&ra= " << &ra << endl;
	return 0;
}

【C++初階】引用&內(nèi)聯(lián)函數(shù)&auto關(guān)鍵字&范圍for循環(huán)&nullptr,C++頭疼記,c++,開發(fā)語言

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

//底層是有空間的,按照指針的方式來實(shí)現(xiàn)的
int main()
{
	int a = 10;
	int& ra = a;
	int* pa = &a;
	cout << sizeof(ra) << endl;
	cout << sizeof(pa) << endl;
	return 0;
}

【C++初階】引用&內(nèi)聯(lián)函數(shù)&auto關(guān)鍵字&范圍for循環(huán)&nullptr,C++頭疼記,c++,開發(fā)語言

我們來看下引用和指針的匯編代碼對(duì)比:

【C++初階】引用&內(nèi)聯(lián)函數(shù)&auto關(guān)鍵字&范圍for循環(huán)&nullptr,C++頭疼記,c++,開發(fā)語言

我們會(huì)發(fā)現(xiàn)C++中的引用和C語言中的指針非常相似,但是還是有很多的區(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ì)更安全?

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

在介紹內(nèi)聯(lián)函數(shù)之前我們還要溫習(xí)以下C語言中的宏

#define Add(x, y) ((x)+(y))
int main()
{
	int x = 1;
	int y = 2;
	cout << Add(x, y) << endl;
	return 0;
}

這是使用宏定義的一個(gè)加法表達(dá)式

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

  1. 不用調(diào)用堆棧,性能高
  2. 代碼復(fù)用性高

宏的缺點(diǎn):

  1. 不可以調(diào)試
  2. 代碼可讀性差,可維護(hù)性差,容易誤用
  3. 沒有類型安全檢查

基于宏的缺點(diǎn)C++使用

  1. 定義常量 換用const enum
  2. 短小函數(shù)的定義 換用內(nèi)聯(lián)函數(shù)

替代C語言中的宏

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

以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)行的效率。

【C++初階】引用&內(nèi)聯(lián)函數(shù)&auto關(guān)鍵字&范圍for循環(huán)&nullptr,C++頭疼記,c++,開發(fā)語言

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

查看方式:
1. 在release模式下,查看編譯器生成的匯編代碼中是否存在call Add
2. 在debug模式下,需要對(duì)編譯器進(jìn)行設(shè)置,否則不會(huì)展開(因?yàn)閐ebug模式下,編譯器默認(rèn)不會(huì)對(duì)代碼進(jìn)行優(yōu)化,以下給出vs2013的設(shè)置方式)

【C++初階】引用&內(nèi)聯(lián)函數(shù)&auto關(guān)鍵字&范圍for循環(huán)&nullptr,C++頭疼記,c++,開發(fā)語言

【C++初階】引用&內(nèi)聯(lián)函數(shù)&auto關(guān)鍵字&范圍for循環(huán)&nullptr,C++頭疼記,c++,開發(fā)語言

  • 內(nèi)聯(lián)函數(shù)的特點(diǎn)

  1. inline是一種以空間換時(shí)間的做法,如果編譯器將函數(shù)當(dāng)成內(nèi)聯(lián)函數(shù)處理,在編譯階段,會(huì)用函數(shù)體替換函數(shù)調(diào)用,缺陷:可能會(huì)使目標(biāo)文件變大,優(yōu)勢(shì):少了調(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))、不是遞歸、且頻繁調(diào)用的函數(shù)采用inline修飾,否則編譯器會(huì)忽略inline特性。
  3. 下圖為《C++prime》第五版關(guān)于inline的建議:
  4. 【C++初階】引用&內(nèi)聯(lián)函數(shù)&auto關(guān)鍵字&范圍for循環(huán)&nullptr,C++頭疼記,c++,開發(fā)語言
  5. inline不建議聲明和定義分離,分離會(huì)導(dǎo)致鏈接錯(cuò)誤。因?yàn)閕nline被展開,就沒有函數(shù)地址了或者說生成的地址不在符號(hào)表中,鏈接就會(huì)找不到。?
// F.h
#include <iostream>
using namespace std;
inline void f(int i);
// F.cpp
#include "F.h"
void f(int i)
{
cout << i << endl;
}
// main.cpp
#include "F.h"
int main()
{
f(10);
return 0;
}
// 鏈接錯(cuò)誤:main.obj : error LNK2019: 無法解析的外部符號(hào) "void __cdecl
f(int)" (?f@@YAXH@Z),該符號(hào)在函數(shù) _main 中被引用

auto關(guān)鍵字

  • 概念

在早期C/C++中auto的含義是:使用auto修飾的變量,是具有自動(dòng)存儲(chǔ)器的局部變量,但遺憾的
是一直沒有人去使用它,大家可思考下為什么?
C++11中,標(biāo)準(zhǔn)委員會(huì)賦予了auto全新的含義即:auto不再是一個(gè)存儲(chǔ)類型指示符,而是作為一
個(gè)新的類型指示符來指示編譯器,auto聲明的變量必須由編譯器在編譯時(shí)期推導(dǎo)而得。

int main()
{
	int a = 10;
	auto b = a;
	auto c = 'a';
	auto d = &a;

	cout << typeid(b).name() << endl;
	cout << typeid(c).name() << endl;
	cout << typeid(d).name() << endl;

	return 0;
}

【C++初階】引用&內(nèi)聯(lián)函數(shù)&auto關(guān)鍵字&范圍for循環(huán)&nullptr,C++頭疼記,c++,開發(fā)語言

注意:
使用auto定義變量時(shí)必須對(duì)其進(jìn)行初始化,在編譯階段編譯器需要根據(jù)初始化表達(dá)式來推導(dǎo)auto
的實(shí)際類型。因此auto并非是一種“類型”的聲明,而是一個(gè)類型聲明時(shí)的“占位符”,編譯器在編
譯期會(huì)將auto替換為變量實(shí)際的類型。

  • auto使用細(xì)則

1. auto與指針和引用結(jié)合起來使用
用auto聲明指針類型時(shí),用auto和auto*沒有任何區(qū)別,但用auto聲明引用類型時(shí)則必須
加&。

int main()
{
	int a = 10;
	auto& ra = a;
	auto pa = &a;
	auto* ppa = &pa;
	cout << typeid(ra).name() << endl;
	cout << typeid(pa).name() << endl;
	cout << typeid(ppa).name() << endl;
	return 0;
}

【C++初階】引用&內(nèi)聯(lián)函數(shù)&auto關(guān)鍵字&范圍for循環(huán)&nullptr,C++頭疼記,c++,開發(fā)語言

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

?
int main()
{
	auto a = 2, b = 3;
	auto c = 4, d = 3.14;//c和d的類型不一樣
	return 0;
}

?

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

  1. 不可以做函數(shù)的參數(shù)
  2. 不可以直接用來聲明數(shù)組
  3. 為了避免與C++98中的auto發(fā)生混淆,C++11只保留了auto作為類型指示符的用法
  4. auto在實(shí)際中最常見的優(yōu)勢(shì)用法就是跟以后會(huì)講到的C++11提供的新式for循環(huán),還有l(wèi)ambda表達(dá)式等進(jìn)行配合使用。

范圍for循環(huán)

我們?cè)谥皩?duì)數(shù)組初始化操作時(shí),要得到數(shù)組的大小遍歷。

int main()
{
	int a[5] = { 1,2,3,4,5 };
	for (int i = 0; i < sizeof(a) / sizeof(a[0]); i++)
	{
		a[i] *= 2;
	}
	for (int i = 0; i < sizeof(a) / sizeof(a[0]); i++)
	{
		cout << a[i];
	}
	return 0;
}

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

int main()
{
	int a[] = { 1,2,3,4,5 };
	for (auto &e : a)
	{
		e *= 2;
	}
	for (auto e : a)
	{
		cout << e << " ";
	}
	return 0;
}

注意:

與普通循環(huán)類似,可以用continue來結(jié)束本次循環(huán),也可以用break來跳出整個(gè)循環(huán)。

  • for范圍的使用條件

  1. for循環(huán)迭代的范圍必須是確定的
  2. 對(duì)于數(shù)組而言,就是數(shù)組中第一個(gè)元素和最后一個(gè)元素的范圍;對(duì)于類而言,應(yīng)該提供begin和end的方法,begin和end就是for循環(huán)迭代的范圍。
  3. 迭代的對(duì)象要實(shí)現(xiàn)++和==的操作。(關(guān)于迭代器這個(gè)問題,以后會(huì)講,現(xiàn)在提一下,沒辦法講清楚,現(xiàn)在大家了解一下就可以了)

指針空值nullptr

在良好的C/C++編程習(xí)慣中,聲明一個(gè)變量時(shí)最好給該變量一個(gè)合適的初始值,否則可能會(huì)出現(xiàn)
不可預(yù)料的錯(cuò)誤,比如未初始化的指針。如果一個(gè)指針沒有合法的指向,我們基本都是按照如下
方式對(duì)其進(jìn)行初始化:

我們先看這段代碼

 void func(int)
{
	cout << "func(int)" << endl;
}
void func(int*)
{
	cout << "func(int*)" << endl;
}
int main()
{
	func(0);
	func(nullptr);
	return 0;
}

【C++初階】引用&內(nèi)聯(lián)函數(shù)&auto關(guān)鍵字&范圍for循環(huán)&nullptr,C++頭疼記,c++,開發(fā)語言

什么原因呢?

NULL實(shí)際是一個(gè)宏,在傳統(tǒng)的C頭文件(stddef.h)中,可以看到如下代碼:

【C++初階】引用&內(nèi)聯(lián)函數(shù)&auto關(guān)鍵字&范圍for循環(huán)&nullptr,C++頭疼記,c++,開發(fā)語言

可以看到,NULL可能被定義為字面常量0,或者被定義為無類型指針(void*)的常量。不論采取何
種定義,在使用空值的指針時(shí),都不可避免的會(huì)遇到一些麻煩。

我們對(duì)上面的代碼改改:

 void func(int)
{
	cout << "func(int)" << endl;
}
void func(int*)
{
	cout << "func(int*)" << endl;
}
int main()
{
	func(0);
	//func(NULL);
	func((int*)NULL);
	return 0;
}

【C++初階】引用&內(nèi)聯(lián)函數(shù)&auto關(guān)鍵字&范圍for循環(huán)&nullptr,C++頭疼記,c++,開發(fā)語言

程序本意是想通過f(NULL)調(diào)用指針版本的f(int*)函數(shù),但是由于NULL被定義成0,因此與程序的
初衷相悖。

在C++98中,字面常量0既可以是一個(gè)整形數(shù)字,也可以是無類型的指針(void*)常量,但是編譯器
默認(rèn)情況下將其看成是一個(gè)整形常量,如果要將其按照指針方式來使用,必須對(duì)其進(jìn)行強(qiáng)轉(zhuǎn)(void
*)0。

注意:

  1. 在使用nullptr表示指針空值時(shí),不需要包含頭文件,因?yàn)閚ullptr是C++11作為新關(guān)鍵字引入的。
  2. 在C++11中,sizeof(nullptr) 與 sizeof((void*)0)所占的字節(jié)數(shù)相同。
  3. 為了提高代碼的健壯性,在后續(xù)表示指針空值時(shí)建議最好使用nullptr。

今天的內(nèi)容到這里就結(jié)束了,看完這篇文章我們也算是步入C++這門語言的大門了。這兩篇內(nèi)容中的知識(shí)在我們以后的文章中會(huì)經(jīng)常用到,希望大家細(xì)細(xì)品味,看完后有很大的收獲。也希望大家留言指出我文章中出現(xiàn)的內(nèi)容,同時(shí)也感謝各位看官的三連支持,你們的支持就是我更新的動(dòng)力?。?!

下篇預(yù)告:類和對(duì)象!??!文章來源地址http://www.zghlxwxcb.cn/news/detail-718786.html

到了這里,關(guān)于【C++初階】引用&內(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)紅包