C++primer標(biāo)準(zhǔn)庫(kù)(2)

作為大四應(yīng)屆生o( ̄︶ ̄)o 最近為了后續(xù)的面試工作地點(diǎn)看C++primer再次深入學(xué)習(xí)C++寫(xiě)里一點(diǎn)筆記:

如下:

1. io庫(kù)

? **istream(輸入流)類提供輸入操作。

? ostream(輸出流)類提供輸出操作。

? cin,一個(gè)istream對(duì)象,從標(biāo)準(zhǔn)輸入讀取數(shù)據(jù)。

? Cout,一個(gè)ostream對(duì)象,向標(biāo)準(zhǔn)輸出寫(xiě)入數(shù)據(jù)。

?? cerr.一個(gè)。stream對(duì)象,通常川J幾輸出程序錯(cuò)誤消臼、,寫(xiě)入到標(biāo)灘錯(cuò)誤

? >>運(yùn)算符,用來(lái)從一個(gè)istream對(duì)象讀取輸入數(shù)據(jù)

? <<運(yùn)算符,少目來(lái)向一個(gè)ostream對(duì)象寫(xiě)入輸出數(shù)據(jù)

? getline函數(shù)從一個(gè)給頂?shù)膇stream讀取行數(shù)據(jù) 存入一個(gè)給定的string對(duì)象。**

2.C++刷新機(jī)制:

一下幾種情況會(huì)導(dǎo)致緩沖區(qū)內(nèi)容被刷新,即寫(xiě)入到真實(shí)的輸出設(shè)備或者文件:

1. 程序正常結(jié)束, 作為main 返回工作的一部分,將情況所有輸出緩沖區(qū);

2. 一些不確定的時(shí)候,緩沖區(qū)可能已滿;

3. 使用manipulator 顯示屬性緩沖區(qū), 比較常用的是endl, flush, ends:

cout<<"hi"<

cout<<"hi"<

cout<<"hi"<

4.? 使用unitbuf 設(shè)置流的內(nèi)部狀態(tài), 適合所有輸出都要刷新緩沖區(qū),unitbuf 和nounitbuf 之間的區(qū)域每次寫(xiě)完后都刷新流

cout<

等價(jià)于

cout<<"first"<

5. 使用tie 將輸入流和輸出流關(guān)聯(lián)起來(lái),? 這種情況下,在讀輸入流時(shí)將刷新其關(guān)聯(lián)的輸出緩沖區(qū),標(biāo)準(zhǔn)庫(kù)默認(rèn)將cout 和cin 綁在一起;

cin.tie(&cout);? // cin 和cout 關(guān)聯(lián)

cin.tie(0);? ? // 解除該流上已存在的捆綁

3.C++ 左右值

左值、右值

在C++11中所有的值必屬于左值、右值兩者之一,右值又可以細(xì)分為純右值、將亡值。在C++11中可以取地址的、有名字的就是左值,反之,不能取地址的、沒(méi)有名字的就是右值(將亡值或純右值)。舉個(gè)例子,int a = b+c, a 就是左值,其有變量名為a,通過(guò)&a可以獲取該變量的地址;表達(dá)式b+c、函數(shù)int func()的返回值是右值,在其被賦值給某一變量前,我們不能通過(guò)變量名找到它,&(b+c)這樣的操作則不會(huì)通過(guò)編譯。

右值、將亡值

在理解C++11的右值前,先看看C++98中右值的概念:C++98中右值是純右值,純右值指的是臨時(shí)變量值、不跟對(duì)象關(guān)聯(lián)的字面量值。臨時(shí)變量指的是非引用返回的函數(shù)返回值、表達(dá)式等,例如函數(shù)int func()的返回值,表達(dá)式a+b;不跟對(duì)象關(guān)聯(lián)的字面量值,例如true,2,”C”等。

C++11對(duì)C++98中的右值進(jìn)行了擴(kuò)充。在C++11中右值又分為純右值(prvalue,Pure Rvalue)和將亡值(xvalue,eXpiring Value)。其中純右值的概念等同于我們?cè)贑++98標(biāo)準(zhǔn)中右值的概念,指的是臨時(shí)變量和不跟對(duì)象關(guān)聯(lián)的字面量值;將亡值則是C++11新增的跟右值引用相關(guān)的表達(dá)式,這樣表達(dá)式通常是將要被移動(dòng)的對(duì)象(移為他用),比如返回右值引用T&&的函數(shù)返回值、std::move的返回值,或者轉(zhuǎn)換為T(mén)&&的類型轉(zhuǎn)換函數(shù)的返回值。

將亡值可以理解為通過(guò)“盜取”其他變量?jī)?nèi)存空間的方式獲取到的值。在確保其他變量不再被使用、或即將被銷毀時(shí),通過(guò)“盜取”的方式可以避免內(nèi)存空間的釋放和分配,能夠延長(zhǎng)變量值的生命期。

左值引用、右值引用

左值引用就是對(duì)一個(gè)左值進(jìn)行引用的類型。右值引用就是對(duì)一個(gè)右值進(jìn)行引用的類型,事實(shí)上,由于右值通常不具有名字,我們也只能通過(guò)引用的方式找到它的存在。

右值引用和左值引用都是屬于引用類型。無(wú)論是聲明一個(gè)左值引用還是右值引用,都必須立即進(jìn)行初始化。而其原因可以理解為是引用類型本身自己并不擁有所綁定對(duì)象的內(nèi)存,只是該對(duì)象的一個(gè)別名。左值引用是具名變量值的別名,而右值引用則是不具名(匿名)變量的別名。

左值引用通常也不能綁定到右值,但常量左值引用是個(gè)“萬(wàn)能”的引用類型。它可以接受非常量左值、常量左值、右值對(duì)其進(jìn)行初始化。不過(guò)常量左值所引用的右值在它的“余生”中只能是只讀的。相對(duì)地,非常量左值只能接受非常量左值對(duì)其進(jìn)行初始化。

int &a = 2;? ? ? # 左值引用綁定到右值,編譯失敗

int b = 2;? ? ? ? # 非常量左值

const int &c = b; # 常量左值引用綁定到非常量左值,編譯通過(guò)

const int d = 2;? # 常量左值

const int &e = c; # 常量左值引用綁定到常量左值,編譯通過(guò)

const int &b =2;? # 常量左值引用綁定到右值,編程通過(guò)

右值值引用通常不能綁定到任何的左值,要想綁定一個(gè)左值到右值引用,通常需要std::move()將左值強(qiáng)制轉(zhuǎn)換為右值,例如:

int a;

int &&r1 = c;? ? ? ? ? ? # 編譯失敗

int &&r2 = std::move(a);? # 編譯通過(guò)

下表列出了在C++11中各種引用類型可以引用的值的類型。值得注意的是,只要能夠綁定右值的引用類型,都能夠延長(zhǎng)右值的生命期。

4 C++引用類型轉(zhuǎn)換

這里std::move的作用是強(qiáng)制一個(gè)左值成為右值(看起來(lái)很奇怪?這個(gè)我們會(huì)在下面一節(jié)中解釋)。該函數(shù)就是使用右值來(lái)初始化Copyable變量news。當(dāng)然,如同我們?cè)谏闲」?jié)提到的,使用移動(dòng)語(yǔ)義的前提是Copyable還需要添加一個(gè)以右值引用為參數(shù)的移動(dòng)構(gòu)造函數(shù),比如:

Copyable(Copyable &&o) { /* 實(shí)現(xiàn)移動(dòng)語(yǔ)義 */ }

來(lái)自https://book.2cto.com/201306/25366.html

5.C++11 lambda

簡(jiǎn)介

Lambda 可能是最新的 C++11 標(biāo)準(zhǔn)的典型特性之一。Lambda 表達(dá)式把函數(shù)看作對(duì)象。Lambda 表達(dá)式可以像對(duì)象一樣使用,比如可以將它們賦給變量和作為參數(shù)傳遞,還可以像函數(shù)一樣對(duì)其求值。

清單 2

Lambda 表達(dá)式的基本語(yǔ)法

Lambda 表達(dá)式本質(zhì)上與函數(shù)聲明非常類似。我們可以提取清單 2 中的 lambda 表達(dá)式,詳加說(shuō)明。提取的 lambda 表達(dá)式如清單 3 所示:

[](int x, int y){ return x < y ; }

清單 3

如果我們將 lambda 表達(dá)式比作函數(shù),可以看到它與函數(shù)名對(duì)應(yīng)的是一對(duì)空的方括號(hào),即捕獲表達(dá)式。這些括號(hào)表示后面跟著一個(gè) lambda 表達(dá)式。這些方括號(hào)不必為空;稍后將討論其內(nèi)容。

如果 lambda 主體只含一個(gè)返回類型,則暗示返回的表達(dá)式類型為 lambda 返回類型。如果要顯式指定返回類型,需使用新的 C++11 語(yǔ)法表示函數(shù)聲明中的后置返回類型。對(duì)于返回類型 T 的普通函數(shù),您可以這樣編寫(xiě):

auto foo(…) -> T { … }

對(duì)于 lambda,您需要要這樣編寫(xiě):

[] (…) -> T { … }

lambda 表達(dá)式的其余部分與常規(guī) C 或 C++ 函數(shù)主體類似。

將 Lambda 傳遞到函數(shù)指針

C++11 標(biāo)準(zhǔn)庫(kù)中有一個(gè)名為 function 的模板,它可以接受指定類型的函數(shù)或者具有匹配的返回類型和參數(shù)列表的 lambda。這將產(chǎn)生一個(gè)指向函數(shù)類型的指針,例如,清單 4 可用作函數(shù)參數(shù)類型,接受 int 參數(shù),返回 void。您可以向其傳遞任何類似匹配函數(shù)或 lambda 的內(nèi)容。

std::function


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容