C++超詳細講解auto與nullptr的使用_第1頁
C++超詳細講解auto與nullptr的使用_第2頁
C++超詳細講解auto與nullptr的使用_第3頁
C++超詳細講解auto與nullptr的使用_第4頁
C++超詳細講解auto與nullptr的使用_第5頁
已閱讀5頁,還剩3頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

第C++超詳細講解auto與nullptr的使用目錄一.auto關鍵字1.auto介紹2.使用規(guī)則3.auto不能推導的場景二.基于范圍的for循環(huán)(C++11)1.范圍for的語法2.范圍for的使用條件三.指針空值nullptr(C++11)

一.auto關鍵字

1.auto介紹

在早期C/C++中auto的含義是:使用auto修飾的變量,是具有自動存儲器的局部變量。

但是在C++11開始,賦予了auto全新的含義即:auto不再是一個存儲類型指示符,而是作為一個新的類型指示符來指示編譯器,auto聲明的變量必須由編譯器在編譯時期推導而得。

intTestAuto()

return10;

intmain()

inta=10;

autob=a;

autoc='a';

autod=TestAuto();

//打印類型

couttypeid(b).name()endl;

couttypeid(c).name()endl;

couttypeid(d).name()endl;

return0;

}

注意:

使用auto定義變量時必須對其進行初始化,在編譯階段編譯器需要根據(jù)初始化表達式來推導auto的實際類型。因此auto并非是一種類型的聲明,而是一個類型聲明時的占位符,編譯器在編譯期會將auto替換為變量實際的類型(自定義類型也可以)。

autoa;無法通過編譯,使用auto定義變量時必須對其進行初始化

2.使用規(guī)則

(1)auto與指針和引用結合起來使用

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

intmain()

intx=10;

constinty=20;

//推斷沒有帶解引用操作符的整形指針

autoa=

autoa2=

//推斷帶解引用操作符的整形指針

auto*b=

//auto*b=x;//注意別寫成這樣,左邊推導一定是指針,x是整形,這樣是會報錯的

auto*b2=

//推斷引用類型

autoc=x;

autoc2=y;

//打印類型

couttypeid(a).name()endl;

couttypeid(b).name()endl;

couttypeid(c).name()endl;

couttypeid(a2).name()endl;

couttypeid(b2).name()endl;

couttypeid(c2).name()endl;

return0;

}

這里發(fā)現(xiàn)了一個問題,我們用const修飾了y,但是推導出來的引用類型居然沒有被const修飾,但是我們在寫代碼的時候不加const編譯器一定會報錯,要注意這里的這個問題

(2)在同一行定義多個變量

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

voidTestAuto()

autoa=1,b=2;

autoc=3,d=4.0;//該行代碼會編譯失敗,因為c和d的初始化表達式類型不同

}

3.auto不能推導的場景

auto不能作為函數(shù)的參數(shù)和返回值

//此處代碼編譯失敗,auto不能作為形參類型,因為編譯器無法對a的實際類型進行推導

voidTestAuto(autoa)

//不然接收和傳參不知道怎么傳參和接收

autoTestAuto(inta)

{}

auto不能直接用來聲明數(shù)組

voidTestAuto()

inta[]={1,2,3};

autob[]={4,5,6};

}

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

auto在實際中最常見的優(yōu)勢用法就是跟以后會講到的C++11提供的新式for循環(huán),還有l(wèi)ambda表達式等進行配合使用。

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

1.范圍for的語法

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

voidTestFor()

intarray[]={1,2,3,4,5};

for(inti=0;isizeof(array)/sizeof(array[0]);++i)

array[i]*=2;

for(int*p=array;parray+sizeof(array)/sizeof(array[0]);++p)

cout*pendl;

}

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

voidTestFor()

//依次自動取array中的數(shù)據(jù)賦值給e,自動判斷結束

intarray[]={1,2,3,4,5};

for(autoe:array)

e*=2;

for(autoe:array)

coute"";

}

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

2.范圍for的使用條件

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

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

以下代碼就有問題,因為for的范圍不確定:

(數(shù)組傳參,數(shù)組會退化成指針,所以這里接受的是指針,就導致了范圍是不確定的)

voidTestFor(intarray[])

for(autoe:array)

couteendl;

}

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

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

C++98中的指針空值,在C/C++中,聲明一個變量時最好給該變量一個合適的初始值,否則可能會出現(xiàn)不可預料的錯誤,比如未初始化的指針。如果一個指針沒有合法的指向,我們基本都是按照如下方式對其進行初始化:

voidTestPtr()

int*p1=NULL;

int*p2=0;

}

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

#ifndefNULL

#ifdef__cplusplus

#defineNULL0

#else

#defineNULL((void*)0)

#endif

#endif

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

voidfun(int)

cout"fun(int)"endl;

voidfun(int*)

cout"fun(int*)"endl;

intmain()

fun(0);

fun(NULL);

fun((int*)NULL);

return0;

}

程序本意是想通過fun(NULL)調(diào)用指針版本的fun(int*)函數(shù),但是由于NULL被定義成0,因此與程序的初衷相悖。在C++98中,字面常量0既可以是一個整形數(shù)字,也可以是無類型的指針(void*)常量,但是編譯器默認情況下將其看成是一個整形常量

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論