版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
知識(shí)提要了解長整型、寬字符型掌握布爾型掌握數(shù)據(jù)類型的轉(zhuǎn)換了解auto、decltype的用法,列表初始化方法了解數(shù)組的替代方案vector、array掌握字符串類string掌握new、delete運(yùn)算符以及引用了解基于范圍的for循環(huán)了解函數(shù)重重載、默認(rèn)參數(shù)、內(nèi)聯(lián)函數(shù)等p12.1數(shù)據(jù)類型1整數(shù)類型2寬字符型3布爾類型p2整數(shù)類型整數(shù)類型簡稱整型,用于表示沒有小數(shù)部分的數(shù)字“寬度(width)”描述存儲(chǔ)整數(shù)時(shí)使用的內(nèi)存大小。寬度越大表示這種類型的數(shù)據(jù)范圍越大。根據(jù)寬度遞增的排序是short、int、long、longlong,每種類型又分為有符號(hào)類型和無符號(hào)類型。p3整數(shù)類型運(yùn)算符sizeof()計(jì)算某種類型在當(dāng)前編譯器中的寬度,以字節(jié)為單位。如,sizeof(int)等于4,表示在當(dāng)前系統(tǒng)中int類型的寬度是4個(gè)字節(jié)<climits>中聲明了一些宏常量,表示某種類型的最大值或最小值。如,INT_MIN表示int類型最小值,INT_MAX表示int類型最大值p4寬字符型1
wchar_t類型
wchar_t類型,稱為寬字符(widecharacters)類型或雙字節(jié)類型。wchar_t數(shù)據(jù)類型一般為16位或32位使用wcin、wcout輸入輸出寬字符類型數(shù)據(jù)。使用字母“L”作為前綴標(biāo)識(shí)寬字符常量或?qū)捵址?。如L'A',表示字母A的wchar_t版本。p5wchar_twch=L'A';//聲明wchar_t類型變量wch,初始化為寬字符Awcout<<wch<<endl;//輸出Acout<<sizeof(wch)<<endl;//在Code::Blocks中輸出2wchar_tws[]=L"Hello";//聲明wchar_t類型數(shù)組ws,初始化為寬字符串Hellocout<<sizeof(ws)<<endl;//輸出12寬字符型2char16_t和char32_t類型char16_t和char32_t類型,它們都是無符號(hào)類型,分別是16位和32位。使用前綴u(小寫)表示char16_t字符常量和字符串常量,如u'A'、u"Helloworld"。使用前綴U(大寫)表示char32_t字符常量和字符串常量,如U'A'、U"Helloworld"。p6布爾類型bool類型(布爾類型)表示真或假,一般占用1個(gè)字節(jié)長度。bool類型只有兩個(gè)取值,true和false。true表示“真”,false表示“假”。如,boolflag=true;bool類型可與數(shù)值型進(jìn)行混合運(yùn)算:true轉(zhuǎn)換為1,false轉(zhuǎn)換為0;非零值轉(zhuǎn)換為true,零轉(zhuǎn)換為falsep7布爾類型bool類型常用于條件判斷。如,用cout輸出bool類型值時(shí),默認(rèn)輸出1(true)或0(false)??梢栽谳敵隽髦胁迦氩倏v符boolalpha強(qiáng)制要求輸出true或falsep8boolflag=true;while(flag){...};boolflag=true;//聲明bool類型變量flag,初始化為truecout<<flag<<endl;//輸出1cout<<boolalpha<<flag<<endl;//輸出truecout<<noboolalpha<<flag<<endl;//輸出1類型轉(zhuǎn)換當(dāng)操作的數(shù)據(jù)類型不同時(shí),C++需要對(duì)數(shù)據(jù)類型進(jìn)行轉(zhuǎn)換,包括:自動(dòng)類型轉(zhuǎn)換強(qiáng)制類型轉(zhuǎn)換p9類型轉(zhuǎn)換自動(dòng)類型轉(zhuǎn)換混合數(shù)據(jù)運(yùn)算的一個(gè)基本的原則是“數(shù)據(jù)類型最好一致”。當(dāng)數(shù)據(jù)類型不一致但兼容時(shí),編譯器能夠?qū)崿F(xiàn)自動(dòng)類型轉(zhuǎn)換。把一種類型的值轉(zhuǎn)換為范圍更大的類型時(shí)通常不會(huì)發(fā)生什么問題。相反地,把一種類型的值轉(zhuǎn)換為范圍更小的類型時(shí)將會(huì)造成數(shù)據(jù)的丟失。p10類型轉(zhuǎn)換強(qiáng)制類型轉(zhuǎn)換格式一:(類型說明符)(表達(dá)式);//C語言風(fēng)格的強(qiáng)制類型轉(zhuǎn)換格式二:類型說明符(表達(dá)式);//C++風(fēng)格的強(qiáng)制類型轉(zhuǎn)換強(qiáng)制類型轉(zhuǎn)換不會(huì)修改原有表達(dá)式的值,而是創(chuàng)建一個(gè)新的、指定類型的值p11(int)(x+y);//把x+y的結(jié)果強(qiáng)制轉(zhuǎn)換為int類型int(x+y);//把x+y的結(jié)果強(qiáng)制轉(zhuǎn)換為int類型,C++風(fēng)格強(qiáng)制類型轉(zhuǎn)換cout<<int('A');//輸出字母A的ASCII值,即輸出65類型轉(zhuǎn)換類型轉(zhuǎn)換運(yùn)算符上述強(qiáng)制類型轉(zhuǎn)換操作是不安全的、或者沒有意義的。例如,C++提供了四個(gè)數(shù)據(jù)類型轉(zhuǎn)換操作符,分別是static_cast、const_cast、dynamic_cast和reinterpret_cast,可以實(shí)現(xiàn)更安全的數(shù)據(jù)類型的轉(zhuǎn)換。p12floatpi=3.14;char*pch=(char*)(&pi);static_cast基本格式功能:把表達(dá)式轉(zhuǎn)換為<>中的類型說明符指定的類型。p13static_cast<類型說明符>(表達(dá)式);charc=‘A’;intn=static_cast<int>(c);static_cast用于類層次結(jié)構(gòu)中基類(父類)和派生類(子類)之間指針或引用的轉(zhuǎn)換。把派生類的指針或引用轉(zhuǎn)換成基類類型(稱為上行轉(zhuǎn)換)時(shí)是安全的;把基類指針或引用轉(zhuǎn)換成派生類類型(稱為下行轉(zhuǎn)換)時(shí),由于沒有動(dòng)態(tài)類型檢查,所以是不安全的。p14static_cast用于基本數(shù)據(jù)類型之間的轉(zhuǎn)換,如把int轉(zhuǎn)換成char,把int轉(zhuǎn)換成enum。這種轉(zhuǎn)換的安全性也要由開發(fā)人員來保證。把空指針轉(zhuǎn)換成目標(biāo)類型的指針。把任何類型的表達(dá)式轉(zhuǎn)換成void類型。注意:static_cast不能轉(zhuǎn)換掉表達(dá)式的const、volatile等屬性。如,p15floatpi=3.14;intn=static_cast<int>(pi);//正確,n=3constintm=1;int*p=static_cast<int*>(&m);//錯(cuò)誤:invalidstatic_castfromtype'constint*'totype'int*'dynamic_cast基本格式其功能是把表達(dá)式轉(zhuǎn)換為<>中的類型說明符指定的類型。其中,類型說明符必須是類的指針、類的引用或者void*。dynamic_cast主要用于類層次間的上行轉(zhuǎn)換和下行轉(zhuǎn)換,還可以用于類之間的交叉轉(zhuǎn)換。p16dynamic_cast<類型說明符>(表達(dá)式);const_cast基本格式主要作用是修改類型的const或volatile屬性。除了const或volatile修飾之外,表達(dá)式的類型與<>中的類型說明符是一致的。如,p17const_cast<類型說明符>(表達(dá)式);constinta=1;int*p=const_cast<int*>(&a);*p=2;cout<<*p<<","<<a<<endl;//輸出2,1reinterpret_cast基本格式用在任意指針(或引用)類型之間的轉(zhuǎn)換,以及指針與足夠大的整數(shù)類型之間的轉(zhuǎn)換。類型說明符必須是一個(gè)指針、引用、算術(shù)類型、函數(shù)指針或者成員指針。p18reinterpret_cast<類型說明符>(表達(dá)式);reinterpret_cast從指針類型到一個(gè)足夠大的整數(shù)類型。從整數(shù)類型或者枚舉類型到指針類型。從一個(gè)指向函數(shù)的指針到另一個(gè)不同類型的指向函數(shù)的指針。從一個(gè)指向?qū)ο蟮闹羔樀搅硪粋€(gè)不同類型的指向?qū)ο蟮闹羔?。從一個(gè)指向類函數(shù)成員的指針到另一個(gè)指向不同類型的函數(shù)成員的指針。從一個(gè)指向類數(shù)據(jù)成員的指針到另一個(gè)指向不同類型的數(shù)據(jù)成員的指針。p19structdata{shorta,b;};longn=0x12345678;data*p=reinterpret_cast<data*>(&n);cout<<hex<<p->a;//在Code::Blocks中輸出56782.2變量聲明及初始化變量要遵循“先聲明,后使用”的原則變量在使用之前必須為其賦值,可以在聲明變量的同時(shí)為變量初始化。C++擴(kuò)充了變量聲明及初始化的方法,可以實(shí)現(xiàn)變量類型的自動(dòng)推斷,并實(shí)現(xiàn)統(tǒng)一的初始化的方法。p20auto類型說明C++11擴(kuò)充了關(guān)鍵字auto的功能,可以用作類型說明符聲明變量,編譯器根據(jù)為變量初始化的值的類型自動(dòng)推斷變量的類型。例如,使用auto關(guān)鍵字聲明變量時(shí)必須為變量顯式地指定初始值,因?yàn)榫幾g器需要根據(jù)初始值的類型推斷變量的類型。自動(dòng)類型推斷更多的是為了簡化代碼。如,p21auton=1;//變量n的類型是int,等價(jià)于intn=1;autoch='A';//變量ch的類型是charvector<string>vs;//聲明向量容器vs,vs中存儲(chǔ)string類型對(duì)象for(vector<string>::iteratorit=vs.begin();it!=vs.end();it++){//...}C++11允許您使用auto關(guān)鍵字簡化上述代碼:vector<string>vs;//聲明向量容器vs,vs中存儲(chǔ)string類型對(duì)象for(autoit=vs.begin();it!=vs.end();it++){//...}關(guān)鍵字decltype作用:選擇并返回表達(dá)式的數(shù)據(jù)類型,在此過程中,編譯器分析表達(dá)式并得到它的類型,卻不實(shí)際計(jì)算表達(dá)式的值。decltype更多地用于函數(shù)類型聲明中,結(jié)合auto和decltype可以在函數(shù)模板中定義函數(shù)的返回值類型。如,p22intn=3;decltype(n)m;//變量m的類型與變量n的類型一致,即用n的類型(int)聲明變量m,m不使用n的值template<typenameT1,typenameT2>autoadd(T1x,T2y)->decltype(x+y){returnx+y;}列表初始化以前,我們最常用的變量初始化的方法如下:事實(shí)上,C++對(duì)數(shù)據(jù)的初始化操作有多種寫法。如,C++11新標(biāo)準(zhǔn)推薦使用大括號(hào)“{}”完成變量初始化。這種初始的形式稱為列表初始化(list-initialization)。p23intn=0;intn1=1;intn2(1);intn3={1};intn4{1};列表初始化列表初始化應(yīng)用于基本數(shù)據(jù)類型時(shí)不允許“縮窄(narrowing)”賦值,即,用寬數(shù)據(jù)為窄數(shù)據(jù)類型變量賦值。p24intn{3.14};上述語句編譯時(shí)出現(xiàn)語法錯(cuò)誤:error:narrowingconversionof'3.1400000000000001e+0'from'double'to'int'inside{}值得注意的是,有些編譯器可能僅給出警告,并不出錯(cuò),如在Dev-C++下的提示是:[Warning]narrowingconversionof'3.1400000000000001e+0'from'double'to'int'inside{}2.3數(shù)組的替代方案數(shù)組是一種構(gòu)造類型,用于表示一組類型相同的數(shù)據(jù)。如,數(shù)組一旦聲明,其長度就是確定的。數(shù)組的下標(biāo)從0開始,在使用數(shù)組元素時(shí)尤其要注意下標(biāo)不能越界。如,兩個(gè)數(shù)組不能直接通過數(shù)組名完成賦值,即使兩個(gè)數(shù)組類型及大小完全相同。如,p25intnArray[5]{1,2,3,4,5};for(inti=0;i<5;i++){ cout<<nArray[i]<<"";}nArray[6]=1;在語法上并沒有錯(cuò)誤,但是這種操作是不安全的。因?yàn)?,nArray[6]并不是程序員可控制的內(nèi)存區(qū)域。
intarr[5]=nArray;//nArray是前面聲明的數(shù)組上述語句編譯時(shí)出現(xiàn)語法錯(cuò)誤:error:arraymustbeinitializedwithabrace-enclosedinitializer向量vectorvector可以看作一個(gè)動(dòng)態(tài)數(shù)組,用于存儲(chǔ)一組數(shù)據(jù)類型相同的數(shù)據(jù),對(duì)數(shù)據(jù)元素的個(gè)數(shù)沒有限制??梢园裿ector看作一個(gè)存放任意數(shù)據(jù)類型的“容器”使用vector需要包含頭文件<vector>。聲明vector對(duì)象的方法:p26vector<類型說明符>對(duì)象名;vector<類型說明符>對(duì)象名(元素個(gè)數(shù));vector<類型說明符>對(duì)象名{元素初值列表};vector<int>nV1;vector<float>fV2(10);vector<int>nV3{1,2,3,4,5};向量vector元素的訪問方法有兩種:下標(biāo)法使用函數(shù)at()例2-1p27vector<int>nV3{1,2,3,4,5};nV3[2];nV3.at(2);類模板arrayarray與普通數(shù)組一樣,也實(shí)現(xiàn)為一個(gè)定長的數(shù)組使用array需要包含頭文件<array>聲明array類型變量的基本格式如下:p28array<類型說明符,數(shù)組長度>數(shù)組名;array<float,10>arr1;array<int,5>arr2{1,2,3,4,5};類模板array1.元素訪問下標(biāo)運(yùn)算符“[]”、at()、front()、back()、data()等成員函數(shù)(1)下標(biāo)運(yùn)算符[]下標(biāo)從0開始,程序員控制下標(biāo)不能越界p29基本格式:數(shù)組名[下標(biāo)]cout<<arr2[2];//輸出下標(biāo)為2的元素,輸出3arr2[0]=0;//第一個(gè)元素值改為0類模板array1.元素訪問(1)at()注意:下標(biāo)不能越界,如果下標(biāo)越界編譯時(shí)無法檢查出錯(cuò)誤,但是程序運(yùn)行時(shí)會(huì)出錯(cuò),拋出異常。如,p30基本格式:數(shù)組名.at(下標(biāo))cout<<arr2.at(2);//3,輸出下標(biāo)為2的元素arr2.at(0)=0;//第一個(gè)元素值改為0cout<<arr2.at(10);//arr2的下標(biāo)值的范圍是[0,9]運(yùn)行時(shí)出錯(cuò),如圖類模板array1.元素訪問(3)front()p31基本格式:數(shù)組名.front()函數(shù)功能:返回第一個(gè)元素,相當(dāng)于at(0)。如,cout<<arr2.front();//1,輸出第一個(gè)元素值arr2.front()=0;//第一個(gè)元素值改為0類模板array1.元素訪問(4)back()基本格式:數(shù)組名.back()函數(shù)功能:返回最后一個(gè)元素。如,cout<<arr2.back();//5,輸出第一個(gè)元素值arr2.back()=0;//最后一個(gè)元素值改為0p32類模板array1.元素訪問(5)data()基本格式:數(shù)組名.data()函數(shù)功能:返回指向第一個(gè)元素的指針。如,array<int,5>arr2{1,2,3,4,5};*arr2.data()=0;//相當(dāng)于arr2.front()=0;cout<<*(arr2.data()+2);//3,輸出下標(biāo)為2的元素值p33類模板array2.迭代器運(yùn)算函數(shù)迭代器(iterator)即指向array容器的元素的指針,它具有指針的一般性質(zhì),如解引用運(yùn)算“*”、指針移動(dòng)(如自增“++”自減“--”)等。相關(guān)的成員函數(shù)包括:begin()、end()、cbegin()、cend()、rbegin()、rend()。p34類模板array2.迭代器運(yùn)算函數(shù)(1)begin()、end()基本格式:數(shù)組名.begin()或數(shù)組名.end(),分別返回第一個(gè)元素的迭代器和最后一個(gè)元素后面位置的迭代器。如圖p35類模板array2.迭代器運(yùn)算函數(shù)(2)cbegin()、cend()基本格式與功能與begin()、end()相同與begin()、end()的區(qū)別是,begin()、end()可以通過迭代器修改迭代器指向的元素的值,而cbegin()和cend()迭代器是常量(const)迭代器,不能修改迭代器指向的元素的值。p36類模板array2.迭代器運(yùn)算函數(shù)(3)rbegin()、rend()基本格式:數(shù)組名.rbegin()或數(shù)組名.rend(),分別返回最后一個(gè)元素的迭代器和第一個(gè)元素前面位置的迭代器。如圖。例2-2p372.3數(shù)組的替代方案數(shù)組、vector、array的主要區(qū)別有:(1)數(shù)組元素訪問方法只有下標(biāo)法,而且對(duì)數(shù)組元素的下標(biāo)不做越界檢查。vector和array提供了兩種元素訪問方法:下標(biāo)法及成員函數(shù)at()。其中,成員函數(shù)at()能夠?qū)ο聵?biāo)越界做出反應(yīng),若下標(biāo)越界會(huì)拋出異常。p382.3數(shù)組的替代方案數(shù)組、vector、array的主要區(qū)別有:(2)數(shù)組和array實(shí)現(xiàn)為一個(gè)定長的數(shù)組,而vector可以實(shí)現(xiàn)為動(dòng)態(tài)數(shù)組。所以當(dāng)數(shù)組元素個(gè)數(shù)不確定并且有較大的變化時(shí),使用vector實(shí)現(xiàn)。但是,vector在實(shí)現(xiàn)上效率較低,如果數(shù)組元素個(gè)數(shù)是確定的,優(yōu)先使用數(shù)組或array;(3)數(shù)組無法直接實(shí)現(xiàn)復(fù)制,必須逐個(gè)元素進(jìn)行復(fù)制。而兩個(gè)相同類型的vector和array對(duì)象可以直接進(jìn)行賦值。p392.4字符串stringstring是C++標(biāo)準(zhǔn)模板庫中的一個(gè)字符串類,包含在頭文件<string>中。string類位于名稱空間std中,必須提供一條using編譯指令或者使用std::string來引用它。使用string處理字符串方便快捷,不用考慮字符串的長度、內(nèi)存空間不足等情況。string類提供了豐富的成員函數(shù)。p40定義string字符串常用的格式1.strings1;
//聲明字符串s1,s1是空字符串,沒有任何元素。2.strings2("Helloworld");//聲明字符串s2,用字符串常量"Helloworld"初始化。這種格式還可以等價(jià)地寫為:strings2="Helloworld";3.strings3{"Helloworld"};//聲明字符串s3,使用列表初始化的方法初始化s3。p41定義string字符串常用的格式4.strings4(5,'a');聲明字符串s4,用5個(gè)字符'a'初始化s4。5.strings5(s2);聲明字符串s5,并用字符串s2初始化s5。p42string的常用操作1.字符串?dāng)?shù)據(jù)的輸入與輸出p43string的常用操作1.字符串?dāng)?shù)據(jù)的輸入與輸出可以使用輸入流對(duì)象cin輸入一個(gè)字符串,但輸入的字符串中不能包含空格、回車、Tab制表符等可以使用getline()函數(shù)輸入字符串,其基本格式p44格式一:getline(cin,字符串,終止符)格式二:getline(cin,字符串)getline(cin,s1,'*');getline(cin,s1);strings1;cin>>s1;//可以輸入Hello、world等字符串,但是不能輸入Helloworld字符串string的常用操作1.字符串?dāng)?shù)據(jù)的輸入與輸出字符串的輸出很簡單,直接使用cout把字符串的內(nèi)容輸出到顯示器上。p45cout<<s1;string的常用操作2.字符串的連接可以使用運(yùn)算符“+”實(shí)現(xiàn)兩個(gè)字符串的連接,不必考慮內(nèi)存大小的問題。如,p46s1=s1+s2;//把字符串s2連接到字符串s1的末尾,無需考慮s1的大小string的常用操作3.字符串大小比較可以直接使用關(guān)系運(yùn)算符比較兩個(gè)字符串的大小,比較規(guī)則是從頭開始依次比較每個(gè)字符的ASCII大小,直到比較出結(jié)果為止。如,成員函數(shù)compare()也提供了字符串大小比較的功能。compare()有多種用法,其中最基本的用法是:p47intcompare(conststring&str)const;如,pare(s2)strings1{"abc"};strings2{"ad");則s1<s2結(jié)果為true。string的常用操作4.訪問字符串中某個(gè)元素可以使用下標(biāo)運(yùn)算符“[]”或者成員函數(shù)at()訪問某個(gè)元素。但是需要注意下標(biāo)不能越界。如,最后一條語句不能正常執(zhí)行,因?yàn)樽址?Helloworld"有11個(gè)字符,所以s1的長度是11,下標(biāo)最大值是10。所以s1.at(11)的下標(biāo)越界,運(yùn)行時(shí)會(huì)拋出異常。p48strings1{"Helloworld"};cout<<s1[0]<<","<<s1.at(1);//輸出H,ecout<<s1.at(11);string的常用操作5.部分常用成員函數(shù)string類提供了豐富的成員函數(shù),表2-1列出了部分常用成員函數(shù)。(請(qǐng)參考課本)例2-3p49string的常用操作6.與string相關(guān)的類型轉(zhuǎn)換函數(shù)p502.5指針與引用C++中的指針是繼承于C語言的一種復(fù)合數(shù)據(jù)類型,其使用方法也是C語言一樣。在定義指針變量時(shí),通常要對(duì)指針變量賦初值,防止使用野指針導(dǎo)致程序異常。如,如果指針無法確定指向哪塊內(nèi)存,通常的做法是將指針賦值為“空”指針。如,p51int*p;*p=1;//錯(cuò)誤,對(duì)未經(jīng)賦值的指針直接修改其內(nèi)存是非法的int*p1=NULL;int*p2=0;int*p3=nullptr;//C++中的標(biāo)準(zhǔn)用法2.5指針與引用在C++編程中經(jīng)常使用指針管理計(jì)算機(jī)內(nèi)存,如內(nèi)存的申請(qǐng)與釋放。C++使用運(yùn)算符new請(qǐng)求正確數(shù)量的內(nèi)存以及使用指針來跟蹤新分配的內(nèi)存空間的位置。雖然在C語言中也提供了庫函數(shù)(如malloc()、free()等)實(shí)現(xiàn)內(nèi)存的管理,但是C++中新提供的運(yùn)算符new和delete遠(yuǎn)比它們使用方便,而且功能更強(qiáng)。p52new運(yùn)算符基本格式格式一:類型說明符*指針變量名=new類型說明符;格式二:類型說明符*指針變量名=new類型說明符[數(shù)組長度];p53int*p=newint();//申請(qǐng)一塊能夠存儲(chǔ)一個(gè)int類型數(shù)據(jù)的內(nèi)存空間,默認(rèn)初值為0int*p=newint(1);//申請(qǐng)一塊能夠存儲(chǔ)一個(gè)int類型數(shù)據(jù)的內(nèi)存空間,默認(rèn)初值為1int*p=newint{1};//完全等價(jià)于int*p=newint(1);int*p=newint[10];//申請(qǐng)連續(xù)的內(nèi)存存儲(chǔ)10個(gè)int類型的數(shù)據(jù)int*p=newint[10]();//編譯器自動(dòng)為元素初始化為0int*p=newint[5]{1,2,3,4,5};//進(jìn)行初始化int*p=newint[5]{1};//第一個(gè)元素初始化值為1int*p=newint[-1];//錯(cuò)誤,程序拋出異常delete運(yùn)算符使用格式格式一:delete指針名;格式二:delete[]指針名;例2-4例2-5p54deletep;delete[]p;new與delete運(yùn)算符通常情況下,new和delete成對(duì)使用,而new[]與delete[]成對(duì)使用。如,p55int*p1=newint;...;deletep1;int*p2=newint[5];...;delete[]p2;引用運(yùn)算符引用(reference)是C++引入的新語言特性,是C++常用的一個(gè)重要內(nèi)容之一。引用是隱式的指針,就是給某一變量(或?qū)ο螅┒x一個(gè)別名。聲明引用后,對(duì)引用的操作與對(duì)變量的操作是完全一樣的。引用分兩種左值引用右值引用。p56引用運(yùn)算符1.聲明左值引用左值(lvalue)一般是指可以放在賦值號(hào)左側(cè)的對(duì)象,普通的變量均是左值。聲明格式:p57類型說明符&引用名=目標(biāo)變量名;inta;int&ra=a;//聲明引用ra,它是變量a的引用,即變量a的別名引用運(yùn)算符左值引用的幾點(diǎn)說明:(1)“&”不是取地址運(yùn)算,而是起標(biāo)識(shí)作用,用于說明所定義的標(biāo)識(shí)符是一個(gè)引用。(2)類型說明符是指目標(biāo)變量的類型,即引用的類型與目標(biāo)變量的類型必須相同。(3)聲明引用時(shí),必須同時(shí)對(duì)其進(jìn)行初始化。如,語句int&ra;是非法的。p58引用運(yùn)算符左值引用的幾點(diǎn)說明:(4)引用聲明后,相當(dāng)于目標(biāo)變量名有兩個(gè)名稱,即該目標(biāo)原名稱和引用名,且不能再把該引用名作為其它變量名的別名。例如,p59inta=1,b=2;int&ra=a;ra=b;第三句ra=b相當(dāng)于a=b,即用變量b為變量a賦值,并不是說ra重新引用變量b。引用運(yùn)算符左值引用的幾點(diǎn)說明:(5)聲明一個(gè)引用,不是新定義了一個(gè)變量,它本身不是一種數(shù)據(jù)類型。因此編譯器不給引用分配存儲(chǔ)單元。在設(shè)計(jì)函數(shù)的形式參數(shù)時(shí)通常把形參設(shè)計(jì)為引用,利用這個(gè)特征節(jié)省內(nèi)存。(6)不能建立數(shù)組的引用。因?yàn)閿?shù)組是一個(gè)由若干個(gè)元素所組成的集合,所以無法建立一個(gè)數(shù)組的別名。p60引用運(yùn)算符左值引用的幾點(diǎn)說明:(7)引用實(shí)際上是隱式的指針,它與指針的區(qū)別是指針是一種數(shù)據(jù)類型(構(gòu)造數(shù)據(jù)類型)而引用不是。指針可以轉(zhuǎn)換為它所指向的變量的數(shù)據(jù)類型。如,引用不能進(jìn)行數(shù)據(jù)類型轉(zhuǎn)換,必須與目標(biāo)變量的類型一致。如,p61inta=1;double*p=(double*)(&a);//雖然這樣做可能沒有任何意義,但從語法角度說是正確的inta=1;double&ra=a;//語法錯(cuò)誤:error:invalidinitializationofnon-constreferenceoftype'double&'fromanrvalueoftype'double'引用運(yùn)算符左值引用的幾點(diǎn)說明:(8)左值引用不能綁定常量,即不能建立常量的左值引用,如p62int&ra=1;//語法錯(cuò)誤:error:invalidinitializationofnon-constreferenceoftype'int&'fromanrvalueoftype'int'引用運(yùn)算符2.用const限定左值引用const的內(nèi)涵是指不能通過常引用對(duì)目標(biāo)變量的值進(jìn)行修改,從而使引用的目標(biāo)成為const,達(dá)到了引用的安全性。如,常變量只能創(chuàng)建常左值引用,不能創(chuàng)建非常左值引用。如p63const類型說明符&引用名=目標(biāo)變量名;inta=0;constint&ra=a;ra=1;//語法錯(cuò)誤:error:assignmentofread-onlyreference'ra'constinta=1;constint&cra=a;//正確int&ra=a;//錯(cuò)誤error:binding'constint'toreferenceoftype'int&'discardsqualifiers引用運(yùn)算符3.右值引用右值是相對(duì)于左值而言的,右值一般可以放在賦值號(hào)的右端,常見的常量、表達(dá)式等都是右值。為了支持移動(dòng)操作(包括移動(dòng)構(gòu)造函數(shù)和移動(dòng)賦值函數(shù)),C++引入了一種新的引用類型——右值引用(rvaluereference),可以自由接管右值引用的對(duì)象內(nèi)容。右值引用的一個(gè)重要特性就是能夠綁定一個(gè)將要銷毀的對(duì)象。p64引用運(yùn)算符3.右值引用左值引用必須引用一個(gè)變量,與左值引用相反,右值引用不能引用變量。如,p65類型說明符&&右值引用名=右值;int&&ra=1;int&&rb=(2*a);inta=1;int&&ra=a;//錯(cuò)誤Error:cannotbind'int'lvalueto'int&&'2.6基于范圍的for循環(huán)C++11提供了一種稱為基于范圍(range-based)的for循環(huán)?;靖袷饺缦拢簆66for(變量聲明:表達(dá)式){
語句序列;}array<int,5>arr{1,2,3,4,5};for(intx:arr){cout<<x<<"";//輸出12345}strings{"china"};for(char&x:s){x=x-32;}cout<<s<<endl;//輸出CHINA2.7函數(shù)剖析函數(shù)是組成程序的最基本模塊,函數(shù)實(shí)現(xiàn)某個(gè)特定的功能。函數(shù)包含系統(tǒng)庫函數(shù)和自定義函數(shù)兩種。自定義函數(shù)的基本格式如下:接下來,我們?cè)敿?xì)討論函數(shù)參數(shù)的引用傳遞、函數(shù)形參默認(rèn)值、函數(shù)的重載、內(nèi)聯(lián)函數(shù)等p67返回值類型函數(shù)名(形參列表){
函數(shù)體語句;}引用作為函數(shù)參數(shù)C++中的參數(shù)傳遞主要有兩類:按值傳遞按引用傳遞按值傳遞主要有兩種傳遞表達(dá)式的值傳遞地址值(指針)編寫函數(shù)實(shí)現(xiàn)兩個(gè)整數(shù)的交換p68引用作為函數(shù)參數(shù)1.傳遞表達(dá)式的值例2-6p69引用作為函數(shù)參數(shù)2.傳遞變量的地址值(指針)例2-7p70引用作為函數(shù)參數(shù)3.引用作為函數(shù)參數(shù)例2-8p71引用作為函數(shù)參數(shù)在用引用作為形參時(shí),如果不希望在被調(diào)用函數(shù)中修改被引用變量(即實(shí)參)的值,可以使用關(guān)鍵字const來限定形參,這樣形參就成為常引用。p72boolisLarger(conststring&s1,conststring&s2){ returns1>s2;}引用作為函數(shù)參數(shù)用const限定形參引用總是最“好”的選擇,因?yàn)椋海?)使用const可以避免無意中修改實(shí)參變量的值。(2)使用const聲明形參,使函數(shù)能夠處理const和非const實(shí)參,否則將只能接受非const實(shí)參。(3)使用const引用使函數(shù)能夠接收臨時(shí)變量或常量。p73boolisLarger(conststring&s1,conststring&s2){returns1>s2;}并且有如下變量:conststrings1="Hello",s2="Hi";strings3="fine",s4="good";則,以下函數(shù)調(diào)用都是正確的:if(isLarger(s1,s2)){...;}if(isLarger(s2,s4)){...;}if(isLarger("Shandong","Shanghai")){...;}if(isLarger(s1+s3,s2+s4)){...;}函數(shù)重載“函數(shù)重載(overload)”是指在同一個(gè)作用域內(nèi)定義多個(gè)函數(shù)名相同但形參不同的函數(shù)。即,同名函數(shù)實(shí)現(xiàn)不同的函數(shù)功能。函數(shù)的形參列表也稱為函數(shù)的特征標(biāo),函數(shù)重載的關(guān)鍵是函數(shù)具有不同的特征標(biāo)。函數(shù)重載時(shí),函
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度汽車租賃及道路救援服務(wù)合同4篇
- 疫情期間便攜施工方案
- 建筑工程采購分包合同(2篇)
- 2025年度個(gè)人門面出租合同及裝修設(shè)計(jì)服務(wù)4篇
- 2025年度個(gè)人醫(yī)療貸款債權(quán)轉(zhuǎn)讓與健康管理服務(wù)合同3篇
- 2025年度個(gè)人住宅門窗安全性能提升合同4篇
- 鋼塔施工方案
- 預(yù)制樁課程設(shè)計(jì)講解
- 鋼結(jié)構(gòu)課程設(shè)計(jì)加圖紙
- 銀杏主題課程設(shè)計(jì)
- 我的家鄉(xiāng)瓊海
- (2025)專業(yè)技術(shù)人員繼續(xù)教育公需課題庫(附含答案)
- 《互聯(lián)網(wǎng)現(xiàn)狀和發(fā)展》課件
- 【MOOC】計(jì)算機(jī)組成原理-電子科技大學(xué) 中國大學(xué)慕課MOOC答案
- 2024年上海健康醫(yī)學(xué)院單招職業(yè)適應(yīng)性測試題庫及答案解析
- 2024年湖北省武漢市中考語文適應(yīng)性試卷
- 品質(zhì)部組織架構(gòu)圖構(gòu)
- 汽車租賃行業(yè)利潤分析
- 春節(jié)拜年的由來習(xí)俗來歷故事
- 通信電子線路(哈爾濱工程大學(xué))智慧樹知到課后章節(jié)答案2023年下哈爾濱工程大學(xué)
- 皮膚惡性黑色素瘤-疾病研究白皮書
評(píng)論
0/150
提交評(píng)論