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

【C++】: auto關(guān)鍵字(C++11)+基于范圍的for循環(huán)(C++11)+指針空值nullptr(C++11)

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

【C++】: auto關(guān)鍵字(C++11)+基于范圍的for循環(huán)(C++11)+指針空值nullptr(C++11),C/C++,c++

auto關(guān)鍵字(C++11)

隨著程序越來(lái)越復(fù)雜,程序中用到的類型也越來(lái)越復(fù)雜,經(jīng)常體現(xiàn)在:

  1. 類型難于拼寫
  2. 含義不明確導(dǎo)致容易出錯(cuò)
#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;
}
//int main()
//{
//	int a = 0;
//	int b = a;
//	auto c = a;
//	auto d = &a;
//	auto* e = &a;
//	auto& f = a;
//	f++;
//
//	cout << typeid(c).name() << endl;
//	cout << typeid(d).name() << endl;
//	cout << typeid(e).name() << endl;
//	cout << typeid(f).name() << endl;
//
//	return 0;
//}

std::map<std::string, std::string>::iterator 是一個(gè)類型,但是該類型太長(zhǎng)了,特別容
易寫錯(cuò)。聰明的同學(xué)可能已經(jīng)想到:可以通過typedef給類型取別名,比如:

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

使用typedef給類型取別名確實(shí)可以簡(jiǎn)化代碼,但是typedef有會(huì)遇到新的難題

typedef char* pstring;
int main()
{
 const pstring p1;    // 編譯成功還是失敗?
 const pstring* p2;   // 編譯成功還是失???
 return 0;
}

在編程時(shí),常常需要把表達(dá)式的值賦值給變量,這就要求在聲明變量的時(shí)候清楚地知道表達(dá)式的
類型。然而有時(shí)候要做到這點(diǎn)并非那么容易,因此C++11給auto賦予了新的含義

這里需要強(qiáng)調(diào)一點(diǎn)的就是auto不能做參數(shù) 不能做返回值

// 不能做參數(shù),不能做返回值
//void func(auto e)
//{
//
//}

//auto func(auto e)
//{
//
//}

auto簡(jiǎn)介

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

int TestAuto()
{
return 10;
}
int main()
{
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;
//auto e; 無(wú)法通過編譯,使用auto定義變量時(shí)必須對(duì)其進(jìn)行初始化
return 0;
}

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

auto的使用細(xì)則

  1. auto與指針和引用結(jié)合起來(lái)使用
    用auto聲明指針類型時(shí),用auto和auto*沒有任何區(qū)別,但用auto聲明引用類型時(shí)則必須加&
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;
}

下面有個(gè)引用和auto的融會(huì)貫通使用

//int main()
//{
//	int a = 0;
//	int b = a;
//	auto c = a;
//	auto d = &a;
//	auto* e = &a;
//	auto& f = a;
//	f++;
//
//	cout << typeid(c).name() << endl;
//	cout << typeid(d).name() << endl;
//	cout << typeid(e).name() << endl;
//	cout << typeid(f).name() << endl;
//
//	return 0;
//}
  1. 在同一行定義多個(gè)變量
    當(dāng)在同一行聲明多個(gè)變量時(shí),這些變量必須是相同的類型,否則編譯器將會(huì)報(bào)錯(cuò),因?yàn)榫幾g器實(shí)際只對(duì)第一個(gè)類型進(jìn)行推導(dǎo),然后用推導(dǎo)出來(lái)的類型定義其他變量
void TestAuto()
{
    auto a = 1, b = 2; 
    auto c = 3, d = 4.0;  // 該行代碼會(huì)編譯失敗,因?yàn)閏和d的初始化表達(dá)式類型不同
}

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

  1. auto不能作為函數(shù)的參數(shù)
// 此處代碼編譯失敗,auto不能作為形參類型,因?yàn)榫幾g器無(wú)法對(duì)a的實(shí)際類型進(jìn)行推導(dǎo)
void TestAuto(auto a)
{}
  1. auto不能直接用來(lái)聲明數(shù)組
void TestAuto()
{
    int a[] = {1,2,3};
    auto b[] = {4,5,6};
}
  1. 為了避免與C++98中的auto發(fā)生混淆,C++11只保留了auto作為類型指示符的用法
  2. auto在實(shí)際中最常見的優(yōu)勢(shì)用法就是跟以后會(huì)講到的C++11提供的新式for循環(huán),還有l(wèi)ambda表達(dá)式等進(jìn)行配合使用

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

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

//int main()
//{
//	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;
//
//	// 依次取數(shù)組中數(shù)組賦值給e
//	// 自動(dòng)判斷結(jié)束,自動(dòng)++往后走
//	//for (int e : array)
//	for (auto& e : array)
//	{
//		e++;
//		cout << e << " ";
//	}
//	cout << endl;
//
//	for (auto e : array)
//	{
//		cout << e << " ";
//	}
//	cout << endl;
//
//	return 0;
//}

注意:與普通循環(huán)類似,可以用continue來(lái)結(jié)束本次循環(huán),也可以用break來(lái)跳出整個(gè)循環(huán)
范圍for的使用條件

  1. for循環(huán)迭代的范圍必須是確定的
    對(duì)于數(shù)組而言,就是數(shù)組中第一個(gè)元素和最后一個(gè)元素的范圍;對(duì)于類而言,應(yīng)該提供begin和end的方法,begin和end就是for循環(huán)迭代的范圍
    注意:以下代碼就有問題,因?yàn)閒or的范圍不確定
void TestFor(int array[])
{
    for(auto& e : array)
        cout<< e <<endl;
}
  1. 迭代的對(duì)象要實(shí)現(xiàn)++和==的操作(關(guān)于迭代器這個(gè)問題,以后會(huì)講,現(xiàn)在提一下,沒辦法講清楚,現(xiàn)在大家了解一下就可以了)

指針空值nullptr(C++11)

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

void TestPtr()
{
int* p1 = NULL;
int* p2 = 0;
// ……
}

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

#ifndef NULL
#ifdef __cplusplus
#define NULL   0
#else
#define NULL   ((void *)0)
#endif
#endif

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

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;
}

程序本意是想通過f(NULL)調(diào)用指針版本的f(int*)函數(shù),但是由于NULL被定義成0,因此與程序的初衷相悖
在C++98中,字面常量0既可以是一個(gè)整形數(shù)字,也可以是無(wú)類型的指針(void*)常量,但是編譯器默認(rèn)情況下將其看成是一個(gè)整形常量,如果要將其按照指針方式來(lái)使用,必須對(duì)其進(jìn)行強(qiáng)轉(zhuǎn)(void *)0
注意:文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-717617.html

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

到了這里,關(guān)于【C++】: auto關(guān)鍵字(C++11)+基于范圍的for循環(huán)(C++11)+指針空值nullptr(C++11)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(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)紅包