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

【C++深入淺出】初識C++下篇(auto關(guān)鍵字、范圍for、nullptr指針)

這篇具有很好參考價值的文章主要介紹了【C++深入淺出】初識C++下篇(auto關(guān)鍵字、范圍for、nullptr指針)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

【C++深入淺出】初識C++下篇(auto關(guān)鍵字、范圍for、nullptr指針),C++深入淺出,c++,開發(fā)語言,auto關(guān)鍵字,范圍for,nullptr


目錄

一. 前言

二. auto關(guān)鍵字

2.1 auto的引入

2.2 auto簡介

2.3 auto的使用細則

2.4?auto不能推導的場景

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

3.1 范圍for的語法

3.2 范圍for的原理

3.3 范圍for的使用條件

四. 指針空值nullptr(C++11)


一. 前言

? ? ? ? 上期我們介紹了c++新增的兩個重要語法:引用和內(nèi)聯(lián)函數(shù),今天我們帶來的內(nèi)容是auto關(guān)鍵字、范圍for以及nullptr指針,本期也是初識C++的最后一期。上期回顧:

【C++深入淺出】初識C++中篇(引用、內(nèi)聯(lián)函數(shù))http://t.csdn.cn/LCvY0????????話不多說,直接上菜!?。?/span>

二. auto關(guān)鍵字

2.1 auto的引入

? ? ? ? 在我們寫代碼的過程中,可曾發(fā)現(xiàn),隨著程序越來越復雜,程序中用到的類型也越來越復雜,包括但不限于以下兩點:1.?類型難于拼寫、2.?含義不明確導致容易出錯。例如:

#include <string>
#include <map>
int main()
{
	std::map<std::string, std::string> m{ { "apple", "蘋果" }, { "orange","橙子" },{ "pear","梨" } };
	std::map<std::string, std::string>::iterator it = m.begin();
	while (it != m.end())
	{
		//....
	}
	return 0;
}

你沒有看錯,上面的std::map<std::string, std::string>::iterator?其實是一個類型,是不是非常嚇人【C++深入淺出】初識C++下篇(auto關(guān)鍵字、范圍for、nullptr指針),C++深入淺出,c++,開發(fā)語言,auto關(guān)鍵字,范圍for,nullptr。像這種長類型特別容易寫錯,有的人可能已經(jīng)想到了解決方案:可以通過typedef給類型取別名。是的,這無疑也是種好方法,但使用typedef前我們必須先知道類型,有時候這并不容易做到。那怎么辦呢?不急,C++11中的auto關(guān)鍵字就是為了解決這個問題。

2.2 auto簡介

????????在早期C/C++中使用auto修飾的變量,是具有自動存儲器的局部變量,但由于用處不大,一直沒有人去使用它。

? ? ? ? 而在C++11中,C++標準委員會賦予了auto全新的含義,即auto不再是一個存儲類型指示符,而是作為一個新的類型指示符指示編譯器,使用auto聲明的變量類型編譯器會在編譯時期自動推導而得。

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

#include<string>
int TestAuto()
{
	return 10;
}
int main()
{
	int a = 10;
	string s;
	auto b = a;
	auto c = 'a';
	auto d = TestAuto();
	auto e = s.begin();
	cout << typeid(b).name() << endl; //typeid類似于sizeof一樣,是一個操作符,其可以用來獲取變量的類型。
	cout << typeid(c).name() << endl;
	cout << typeid(d).name() << endl;
	cout << typeid(e).name() << endl;
	//auto e; 無法通過編譯,使用auto定義變量時必須對其進行初始化
	return 0;
}

輸出結(jié)果如下【C++深入淺出】初識C++下篇(auto關(guān)鍵字、范圍for、nullptr指針),C++深入淺出,c++,開發(fā)語言,auto關(guān)鍵字,范圍for,nullptr?

【C++深入淺出】初識C++下篇(auto關(guān)鍵字、范圍for、nullptr指針),C++深入淺出,c++,開發(fā)語言,auto關(guān)鍵字,范圍for,nullptr

可以看出,編譯器自動幫我們將類型推導出來了,是不是非常方便【C++深入淺出】初識C++下篇(auto關(guān)鍵字、范圍for、nullptr指針),C++深入淺出,c++,開發(fā)語言,auto關(guān)鍵字,范圍for,nullptr

2.3 auto的使用細則

? ? ? ? 學會了auto的基本使用,接下來就是避坑時間惹【C++深入淺出】初識C++下篇(auto關(guān)鍵字、范圍for、nullptr指針),C++深入淺出,c++,開發(fā)語言,auto關(guān)鍵字,范圍for,nullptr?

? ? ? ? 1. auto定義變量時必須對其進行初始化

? ? ? ? ?auto并非是一種“類型”的聲明,而是一個類型聲明時的“占位符”。在編譯階段編譯器需要根據(jù)初始化表達式來推導auto的實際類型,然后將auto替換為變量實際的類型。

int main()
{
	int val = 10;
	auto a; //錯誤寫法,編譯時會報錯
	auto b = val; //正確寫法,定義時進行初始化,編譯器才能進行推導然后將auto替換
	return 0;
}

? ? ? ? 2.?auto和指針和引用

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

int main()
{
	int x = 10;
	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;
	return 0;
}

【C++深入淺出】初識C++下篇(auto關(guān)鍵字、范圍for、nullptr指針),C++深入淺出,c++,開發(fā)語言,auto關(guān)鍵字,范圍for,nullptr

?????????3. 在同一行定義多個變量

? ? ? ? ?當在同一行聲明多個變量時,這些變量必須類型相同,否則編譯器將會報錯,因為編譯
器實際只對第一個類型進行推導,然后將auto進行替換,最后用替換后的類型定義其他變量。

int main()
{
	auto a = 1, b = 2; // 正確寫法
	auto c = 3, d = 4.0; // 編譯失敗,因為c和d的初始化表達式類型不同

	return 0;
}

【C++深入淺出】初識C++下篇(auto關(guān)鍵字、范圍for、nullptr指針),C++深入淺出,c++,開發(fā)語言,auto關(guān)鍵字,范圍for,nullptr

2.4?auto不能推導的場景

? ? ? ? 1、auto不能作為函數(shù)的參數(shù)

// 此處代碼編譯失敗,auto不能作為形參類型,
// 原因:函數(shù)調(diào)用傳參發(fā)生在運行階段,故在編譯階段編譯器無法對a的實際類型進行推導
void TestAuto(auto a)
{}

【C++深入淺出】初識C++下篇(auto關(guān)鍵字、范圍for、nullptr指針),C++深入淺出,c++,開發(fā)語言,auto關(guān)鍵字,范圍for,nullptr

? ? ? ? 2.、auto不能直接用來聲明數(shù)組

int main()
{
	int a[] = { 1,2,3 };
	auto b[] = { 4,5,6 };
	return 0;
}

【C++深入淺出】初識C++下篇(auto關(guān)鍵字、范圍for、nullptr指針),C++深入淺出,c++,開發(fā)語言,auto關(guān)鍵字,范圍for,nullptr


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

3.1 范圍for的語法

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

int main()
{
	int array[] = { 1, 2, 3, 4, 5 };
	for (int i = 0; i < sizeof(array) / sizeof(array[0]); ++i)
	{
		array[i] *= 2; //利用下標訪問
	}
	cout << endl;
	for (int* p = array; p < array + sizeof(array) / sizeof(array[0]); ++p)
	{
		cout << *p << ' '; //利用指針訪問
	}
	cout << endl;

}

? ? ? ? 但是對于array這個有范圍的集合而言,由程序員來說明循環(huán)的范圍顯然顯得有點多余,有時候還會容易犯錯誤產(chǎn)生越界。因此C++11中引入了基于范圍的for循環(huán)。for循環(huán)后的括號由冒號分為兩部分:第一部分是范圍內(nèi)迭代取得的變量,第二部分則表示進行迭代的集合對象。上述代碼使用范圍for改寫如下【C++深入淺出】初識C++下篇(auto關(guān)鍵字、范圍for、nullptr指針),C++深入淺出,c++,開發(fā)語言,auto關(guān)鍵字,范圍for,nullptr

int main()
{
	int array[] = { 1, 2, 3, 4, 5 };
	for (auto& e : array) //依次取數(shù)組的數(shù)據(jù)給引用變量e,自動判斷結(jié)束,自動迭代 + 1
	{
		e *= 2;
	}
	for (auto e : array) //依次取數(shù)組的數(shù)據(jù)賦值給變量e,自動判斷結(jié)束,自動迭代 + 1
	{
		cout << e << " ";
	}
	return 0;
}

可以看到,我們使用到了之前學的auto關(guān)鍵字,利用auto的自動類型推導,我們無需顯式地寫出e的類型,使得范圍for的使用更加簡潔方便,這也是auto的常見優(yōu)勢用法之一。


在第一個范圍for中,由于e是引用變量,因此e表示的是數(shù)組每個元素的別名,對e進行修改就是對數(shù)組元素進行修改。

而在第二個范圍for中,e是普通變量,表示的是數(shù)組每個元素的拷貝,對e進行修改對數(shù)組元素沒有影響。


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

【C++深入淺出】初識C++下篇(auto關(guān)鍵字、范圍for、nullptr指針),C++深入淺出,c++,開發(fā)語言,auto關(guān)鍵字,范圍for,nullptr


3.2 范圍for的原理

? ? ? ? 可能會有的小伙伴會好奇:范圍for這個東西這么智能,既能自動迭代,還能自動判斷結(jié)束,那么它的原理究竟是什么呢【C++深入淺出】初識C++下篇(auto關(guān)鍵字、范圍for、nullptr指針),C++深入淺出,c++,開發(fā)語言,auto關(guān)鍵字,范圍for,nullptr?

? ? ? ? ?實際上,并沒有想象中的那么復雜。范圍for的底層原理實際上就是迭代器遍歷編譯器在編譯時會自動將范圍for的代碼替換為迭代器遍歷相關(guān)代碼。迭代器的知識我們后續(xù)會介紹,這里大家將其理解為指針即可。

? ? ? ? 下面是一段vector容器的遍歷代碼:

int main()
{
	vector<int> v;
	for (int i = 1; i <= 5; i++) //插入1-5的數(shù)據(jù)
	{
		v.push_back(i);
	}

	for (auto e : v) //范圍for遍歷
	{
		cout << e << ' ';
	}
	cout << endl;
	return 0;
}

? ? ? ?編譯器編譯時范圍for會替換成類似于如下的代碼:

int main()
{
	vector<int> v;
	for (int i = 1; i <= 5; i++) //插入1-5的數(shù)據(jù)
	{
		v.push_back(i);
	}

	vector<int>::iterator it = v.begin();
	//auto it = v.begin(); //迭代器的類型較長,也可以使用auto自動推導

	while (it != v.end()) //迭代器遍歷,這里將it當做指針理解即可
	{
		cout << *it << ' ';
		it++;
	}
	cout << endl;
	return 0;
}

結(jié)論:范圍for其實就是編譯器進行了替換,本質(zhì)上還是迭代器的遍歷

3.3 范圍for的使用條件

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

????????對于數(shù)組而言,for循環(huán)迭代的范圍就是從數(shù)組中第一個元素到最后一個元素;對于而言,應(yīng)該提供begin和end的方法,begin和end就是for循環(huán)迭代的范圍。

void putArray(int array[])
{
	//數(shù)組傳參發(fā)生降維,array是個指針,指向數(shù)組首元素
	for (auto e : array) //由于array只是個int*指針,我們無法確定迭代的范圍,故這里的范圍for會報錯
	{
		cout << e << ' ';
	}
}
int main()
{

	vector<int> v;
	for (int i = 1; i <= 5; i++) //插入1-5的數(shù)據(jù)
	{
		v.push_back(i);
	}

	for (auto e : v) //范圍for遍歷vector容器類。范圍:v.begin()~v.end()
	{
		cout << e << ' ';
	}
	cout << endl;

	int array[5] = { 1,2,3,4,5 };
	for (auto e : v) //范圍for遍歷array數(shù)組。范圍:從第一個元素的下標0到最后一個元素的下標4
	{
		cout << e << ' ';
	}

	putArray(array);
	return 0;
}

? ? ? ? 2、迭代的對象要實現(xiàn)++和==的操作

? ? ? ? 上面我們看到范圍for替換為迭代器遍歷的代碼中,使用迭代器it進行遍歷時需要用到++和==的操作,顧迭代器需要支持++和==的操作。(目前不清楚的了解一下即可,等到我們講解迭代器時再深入討論)


四. 指針空值nullptr(C++11)

? ? ? ? 在C語言中,我們對指針進行初始化時,經(jīng)常會用NULL空指針進行初始化,如下:

int main()
{
	int* p1 = NULL;
	return 0;
}

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

【C++深入淺出】初識C++下篇(auto關(guān)鍵字、范圍for、nullptr指針),C++深入淺出,c++,開發(fā)語言,auto關(guān)鍵字,范圍for,nullptr

????????可以看到,NULL在C++中被定義為字面常量0,在C語言中被定義為無類型指針(void*)常量。而字面常量0在編譯器看來默認是整形常量,這就會導致出現(xiàn)一些不可預料的錯誤,例如:

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

? ? ? ? 上述代碼在C++中的結(jié)果如下所示【C++深入淺出】初識C++下篇(auto關(guān)鍵字、范圍for、nullptr指針),C++深入淺出,c++,開發(fā)語言,auto關(guān)鍵字,范圍for,nullptr

【C++深入淺出】初識C++下篇(auto關(guān)鍵字、范圍for、nullptr指針),C++深入淺出,c++,開發(fā)語言,auto關(guān)鍵字,范圍for,nullptr

本意我們是想通過f(NULL)調(diào)用指針版本的f(int*)函數(shù),但是由于NULL在C++中被定義成字面常量0,因此調(diào)用了更符合的f(int)函數(shù),與程序的初衷相悖。如果我們執(zhí)意要調(diào)用f(int*)函數(shù),只能將NULL強制類型轉(zhuǎn)換為int*,再進行調(diào)用即可,但這樣會顯得非常奇怪【C++深入淺出】初識C++下篇(auto關(guān)鍵字、范圍for、nullptr指針),C++深入淺出,c++,開發(fā)語言,auto關(guān)鍵字,范圍for,nullptr?


? ? ? ? 出于以上原因,C++11新增了一個關(guān)鍵字nullptr用來表示指針空值,如下:

void f(int)
{
	cout << "f(int)" << endl;
}
void f(int*)
{
	cout << "f(int*)" << endl;
}
int main()
{
	f(0);
	f(nullptr); //nullptr表示空指針
	return 0;
}

? ? ? ? 此時代碼的結(jié)果就符合我們初衷了:【C++深入淺出】初識C++下篇(auto關(guān)鍵字、范圍for、nullptr指針),C++深入淺出,c++,開發(fā)語言,auto關(guān)鍵字,范圍for,nullptr

關(guān)于nullptr的幾點說明與建議?

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

以上,就是本期的全部內(nèi)容啦??

制作不易,能否點個贊再走呢??文章來源地址http://www.zghlxwxcb.cn/news/detail-678333.html

到了這里,關(guān)于【C++深入淺出】初識C++下篇(auto關(guān)鍵字、范圍for、nullptr指針)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • 在瘋狂三月之后,深入淺出分析AIGC的核心價值 (下篇)|【AI行研&商業(yè)價值分析】

    在瘋狂三月之后,深入淺出分析AIGC的核心價值 (下篇)|【AI行研&商業(yè)價值分析】

    Rocky Ding 公眾號:WeThinkIn 【AI行研商業(yè)價值分析】欄目專注于分享AI行業(yè)中最新熱點/風口的思考與判斷。也歡迎大家提出寶貴的優(yōu)化建議,一起交流學習?? 大家好,我是Rocky。 本文是《在瘋狂三月之后,深入淺出分析AIGC的核心價值》系列的第二篇文章,在第一篇文章中,我

    2024年02月16日
    瀏覽(23)
  • 從C語言到C++(第一章_C++入門_下篇)內(nèi)聯(lián)函數(shù)+auto關(guān)鍵字(C++11)+范圍for +nullptr

    從C語言到C++(第一章_C++入門_下篇)內(nèi)聯(lián)函數(shù)+auto關(guān)鍵字(C++11)+范圍for +nullptr

    目錄 1. 內(nèi)聯(lián)函數(shù) 1.1 內(nèi)聯(lián)函數(shù)的概念 1.2 內(nèi)聯(lián)函數(shù)的特性 1.3 宏的優(yōu)缺點和替代方法 2. auto(C++11) 2.1 改版前的auto 2.2 C++11的auto 2.3 auto 的使用場景 2.4?使用auto的注意事項 3. 范圍 for(C++11) 3.1 范圍 for 的用法 3.2 范圍 for 的使用條件 4.?指針空值 nullptr 4.1 C++ 98 中的指針空

    2023年04月21日
    瀏覽(21)
  • 深入淺出C++ ——線程庫

    深入淺出C++ ——線程庫

    ??在C++11之前,涉及到多線程問題,都是和平臺相關(guān)的,比如windows和linux下各有自己的接口,這使得代碼的可移植性比較差。C++11中最重要的特性就是對線程進行支持了,使得C++在并行編程時不需要依賴第三方庫,而且在原子操作中還引入了 原子類 的概念。要使用標準庫中

    2024年02月03日
    瀏覽(98)
  • 深入淺出C++——C++的類型轉(zhuǎn)換

    在C語言中,如果 賦值運算符左右兩側(cè)類型不同 ,或者形參與實參類型不匹配,或者 返回值類型與接收返回值類型不一致 時,就需要發(fā)生類型轉(zhuǎn)化。 C語言中總共有兩種形式的類型轉(zhuǎn)換: 隱式類型轉(zhuǎn)換:編譯器在編譯階段自動進行轉(zhuǎn)換,不能轉(zhuǎn)就編譯失敗。 顯式類型轉(zhuǎn)換:

    2024年02月07日
    瀏覽(95)
  • 深入淺出C++ ——C++11

    深入淺出C++ ——C++11

    ????1998年是C++標準委員會成立的第一年,本來計劃以后每5年視實際需要更新一次標準,C++國際標準委員會在研究C++ 03的下一個版本的時候,一開始計劃是2007年發(fā)布,所以最初這個標準叫C++07。但是到06年的時候,官方覺得2007年肯定完不成C++ 07,而且官方覺得2008年可能也

    2024年02月02日
    瀏覽(35)
  • 【C++】模板初階 【 深入淺出理解 模板 】

    【C++】模板初階 【 深入淺出理解 模板 】

    如何實現(xiàn)一個通用的交換函數(shù)呢? 使用函數(shù)重載雖然可以實現(xiàn) ,但是有一下幾個不好的地方: 重載的函數(shù) 僅僅是類型不同 ,代碼復用率比較低, 只要有新類型出現(xiàn)時,就需要用戶自己增加對應(yīng)的函數(shù) 代碼的可維護性比較低,一個出錯可能所有的重載均出錯 那能否 告訴編

    2024年02月05日
    瀏覽(84)
  • 【C++深入淺出】日期類的實現(xiàn)

    【C++深入淺出】日期類的實現(xiàn)

    目錄 一. 前言? 二. 日期類的框架 三. 日期類的實現(xiàn) 3.1 構(gòu)造函數(shù) 3.2 析構(gòu)函數(shù) 3.3 賦值運算符重載 3.4 關(guān)系運算符重載 3.5 日期 +/-?天數(shù) 3.6 自增與自減運算符重載 3.7 日期 - 日期 四. 完整代碼? ? ? ? ? 通過前面兩期類和對象的學習,我們已經(jīng)對C++的類有了一定的了解。本期我

    2024年02月07日
    瀏覽(91)
  • 【C++】深入淺出STL之vector類

    【C++】深入淺出STL之vector類

    文章篇幅較長,越3萬余字,建議電腦端訪問 大家好,在上一文中,我們重點介紹了 STL中的string類,明白了如何去操作字符串。 本文我們將要來介紹的是STL中的vector類 vector的文檔介紹 vector是表示可變大小數(shù)組的序列容器。 就像數(shù)組一樣,vector也采用的連續(xù)存儲空間來存儲元

    2024年02月13日
    瀏覽(85)
  • 【C++】深入淺出STL之string類

    【C++】深入淺出STL之string類

    文章篇幅較長,越7萬余字,建議電腦端訪問 本文我們就要來說一說STL中的string類,這也是我們在寫C++代碼的時候使用最多的 首先要來談的一點就是為什么要學習string類 string 意為字符串,那回憶一下我們在C語言階段所學習的字符串,是以 \\\'\\0\\\' 結(jié)尾的一些字符的集合,為了操

    2024年02月15日
    瀏覽(89)
  • 【重學C++】02 脫離指針陷阱:深入淺出 C++ 智能指針

    【重學C++】02 脫離指針陷阱:深入淺出 C++ 智能指針 大家好,今天是【重學C++】系列的第二講,我們來聊聊C++的智能指針。 在上一講《01 C++如何進行內(nèi)存資源管理》中,提到了對于堆上的內(nèi)存資源,需要我們手動分配和釋放。管理這些資源是個技術(shù)活,一不小心,就會導致內(nèi)

    2024年02月05日
    瀏覽(91)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包