![C++語言程序設(shè)計(jì)課件_第1頁](http://file4.renrendoc.com/view/4be30e58ac06a94c50ff013dfa550bc0/4be30e58ac06a94c50ff013dfa550bc01.gif)
![C++語言程序設(shè)計(jì)課件_第2頁](http://file4.renrendoc.com/view/4be30e58ac06a94c50ff013dfa550bc0/4be30e58ac06a94c50ff013dfa550bc02.gif)
![C++語言程序設(shè)計(jì)課件_第3頁](http://file4.renrendoc.com/view/4be30e58ac06a94c50ff013dfa550bc0/4be30e58ac06a94c50ff013dfa550bc03.gif)
![C++語言程序設(shè)計(jì)課件_第4頁](http://file4.renrendoc.com/view/4be30e58ac06a94c50ff013dfa550bc0/4be30e58ac06a94c50ff013dfa550bc04.gif)
![C++語言程序設(shè)計(jì)課件_第5頁](http://file4.renrendoc.com/view/4be30e58ac06a94c50ff013dfa550bc0/4be30e58ac06a94c50ff013dfa550bc05.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
C++標(biāo)準(zhǔn)範(fàn)本庫
泛型程式設(shè)計(jì)將程式寫得盡可能通用
將演算法從特定的數(shù)據(jù)結(jié)構(gòu)中抽象出來,成為通用的C++的範(fàn)本為泛型程式設(shè)計(jì)奠定了關(guān)鍵的基礎(chǔ)
STL是泛型程式設(shè)計(jì)的一個(gè)範(fàn)例
容器(container)迭代器(iterator)演算法(algorithms)函數(shù)對(duì)象(functionobject)*命名空間(namespace)一個(gè)命名空間將不同的識(shí)別字集合在一個(gè)命名作用域(namedscope)內(nèi)為了解決命名衝突例如,聲明一個(gè)命名空間NS:namspaceNS{classFile;voidFun();}
則引用識(shí)別字的方式如下,NS::Fileobj;NS::Fun();沒有聲明命名空間的識(shí)別字都處於無名的命名空間中*概念和術(shù)語命名空間(續(xù))可以用using來指定命名空間例如,經(jīng)過以下聲明:
usingNS::File;
在當(dāng)前作用域中就可以直接引用Fileusingnamespacestd;
命名空間std中所有識(shí)別字都可直接引用在新的C++標(biāo)準(zhǔn)程式庫中,所有識(shí)別字都聲明在命名空間std中,頭檔都不使用擴(kuò)展名*概念和術(shù)語容器容器類是容納、包含一組元素或元素集合的對(duì)象。異類容器類與同類容器類順序容器與關(guān)聯(lián)容器七種基本容器:向量(vector)、雙端佇列(deque)、列表(list)、集合(set)、多重集合(multiset)、映射(map)和多重映射(multimap)*概念和術(shù)語容器的介面通用容器運(yùn)算符==,!=,>,>=,<,<=,=方法(函數(shù))迭代方法begin(),end(),rbegin(),rend()訪問方法size(),max_size(),swap(),empty()*適配器適配器是一種介面類為已有的類提供新的介面。目的是簡(jiǎn)化、約束、使之安全、隱藏或者改變被修改類提供的服務(wù)集合。三種類型的適配器:容器適配器用來擴(kuò)展7種基本容器,它們和順序容器相結(jié)合構(gòu)成棧、佇列和優(yōu)先佇列容器迭代器適配器函數(shù)對(duì)象適配器。*概念和術(shù)語迭代器迭代器是面向?qū)ο蟀姹镜闹羔?,它們提供了訪問容器、序列中每個(gè)元素的方法。*概念和術(shù)語演算法C++標(biāo)準(zhǔn)範(fàn)本庫中包括70多個(gè)演算法其中包括查找演算法,排序演算法,消除演算法,記數(shù)演算法,比較演算法,變換演算法,置換演算法和容器管理等等。這些演算法的一個(gè)最重要的特性就是它們的統(tǒng)一性,並且可以廣泛用於不同的對(duì)象和內(nèi)置的數(shù)據(jù)類型。*概念和術(shù)語順序容器順序容器的介面插入方法push_front(),push_back(),insert(),運(yùn)算符“=”刪除方法pop(),erase(),clear()迭代訪問方法使用迭代器其他順序容器訪問方法(不修改訪問方法)front(),back(),下標(biāo)[]運(yùn)算符*容器順序容器——向量向量屬於順序容器,用於容納不定長(zhǎng)線性序列(即線性群體),提供對(duì)序列的快速隨機(jī)訪問(也稱直接訪問)向量是動(dòng)態(tài)結(jié)構(gòu),它的大小不固定,可以在程式運(yùn)行時(shí)增加或減少。例10-1求範(fàn)圍2~N中的質(zhì)數(shù),N在程式運(yùn)行時(shí)由鍵盤輸入。*容器//10_1.cpp#include<iostream>#include<iomanip>#include<vector> //包含向量容器頭檔usingnamespacestd;intmain(){vector<int>A(10); intn; intprimecount=0,i,j;cout<<"Enteravalue>=2asupperlimit:";cin>>n;A[primecount++]=2; **for(i=3;i<n;i++){if(primecount==A.size()) A.resize(primecount+10);if(i%2==0)continue;j=3;while(j<=i/2&&i%j!=0)j+=2;if(j>i/2)A[primecount++]=i;}for(i=0;i<primecount;i++)//輸出質(zhì)數(shù)
{cout<<setw(5)<<A[i];if((i+1)%10==0)//每輸出10個(gè)數(shù)換行一次
cout<<endl;}cout<<endl;}**順序容器——雙端佇列雙端佇列是一種放鬆了訪問許可權(quán)的佇列。元素可以從佇列的兩端入隊(duì)和出隊(duì),也支持通過下標(biāo)操作符“[]”進(jìn)行直接訪問。例10-2使用雙端佇列容器保存double數(shù)值序列*容器順序容器——列表列表主要用於存放雙向鏈表,可以從任意一端開始遍曆。列表還提供了拼接(splicing)操作,將一個(gè)序列中的元素插入到另一個(gè)序列中。例10-3改寫例9-7從鍵盤輸入10個(gè)整數(shù),用這些整數(shù)值作為結(jié)點(diǎn)數(shù)據(jù),生成一個(gè)鏈表,按順序輸出鏈表中結(jié)點(diǎn)的數(shù)值。然後從鍵盤輸入一個(gè)待查找整數(shù),在鏈表中查找該整數(shù),若找到則刪除該整數(shù)所在的結(jié)點(diǎn)(如果出現(xiàn)多次,全部刪除),然後輸出刪除結(jié)點(diǎn)以後的鏈表。在程式結(jié)束之前清空鏈表。*容器//10_3.cpp#include<iostream>#include<list>usingnamespacestd;intmain(){list<int>Link; //構(gòu)造一個(gè)列表用於存放整數(shù)鏈表
inti,key,item;for(i=0;i<10;i++)//輸入10個(gè)整數(shù)依次向表頭插入
{cin>>item;Link.push_front(item);}cout<<"List:";//輸出鏈表**list<int>::iteratorp=Link.begin();while(p!=Link.end())//輸出各節(jié)點(diǎn)數(shù)據(jù),直到鏈表尾
{cout<<*p<<"";p++;//使P指向下一個(gè)節(jié)點(diǎn)
}cout<<endl;cout<<"請(qǐng)輸入一個(gè)需要?jiǎng)h除的整數(shù):";cin>>key;Link.remove(key);cout<<"List:";//輸出鏈表
p=Link.begin(); //使P重新指向表頭
while(p!=Link.end()) {cout<<*p<<"";p++;//使P指向下一個(gè)節(jié)點(diǎn)
}cout<<endl;}**容器適配器容器適配器是用來擴(kuò)展7種基本容器的棧容器使用適配器與一種基礎(chǔ)容器相結(jié)合來實(shí)現(xiàn)例10-4:應(yīng)用標(biāo)準(zhǔn)庫中的deque順序容器生成一個(gè)整數(shù)棧stack。佇列容器使用適配器與一種基礎(chǔ)容器相結(jié)合來實(shí)現(xiàn)的先進(jìn)先出數(shù)據(jù)結(jié)構(gòu)。例10-5:應(yīng)用標(biāo)準(zhǔn)庫中的deque順序容器生成一個(gè)整數(shù)標(biāo)準(zhǔn)佇列queue。*容器什麼是迭代器迭代器是面向?qū)ο蟀姹镜闹羔樦羔樋梢灾赶蛴洃涹w中的一個(gè)地址迭代器可以指向容器中的一個(gè)位置STL的每一個(gè)容器類模版中,都定義了一組對(duì)應(yīng)的迭代器類。使用迭代器,演算法函數(shù)可以訪問容器中指定位置的元素,而無需關(guān)心元素的具體類型。*迭代器迭代器的類型輸入迭代器可以用來從序列中讀取數(shù)據(jù)輸出迭代器允許向序列中寫入數(shù)據(jù)前向迭代器既是輸入迭代器又是輸出迭代器,並且可以對(duì)序列進(jìn)行單向的遍曆雙向迭代器與前向迭代器相似,但是在兩個(gè)方向上都可以對(duì)數(shù)據(jù)遍曆隨機(jī)訪問迭代器也是雙向迭代器,但能夠在序列中的任意兩個(gè)位置之間進(jìn)行跳轉(zhuǎn)。*迭代器迭代器適配器迭代器適配器是用來擴(kuò)展(或調(diào)整)迭代器功能的類。它本身也被稱為迭代器,只是這種迭代器是通過改變另一個(gè)迭代器而得到的逆向迭代器通過重新定義遞增運(yùn)算和遞減運(yùn)算,使其行為正好倒置插入型迭代器將賦值操作轉(zhuǎn)換為插入操作。通過這種迭代器,演算法可以執(zhí)行插入行為而不是覆蓋行為例10-6應(yīng)用逆向迭代器和後插迭代器來操作向量容器中的元素*迭代器迭代器相關(guān)的輔助函數(shù)advance()函數(shù)將迭代器的位置增加,增加的幅度由參數(shù)決定distance()函數(shù)返回迭代器之間的距離函數(shù)iter_swap()交換兩個(gè)迭代器所指向的元素值例10-7用三個(gè)迭代器輔助函數(shù)來操作列表容器中的元素。*迭代器標(biāo)準(zhǔn)C++庫中的演算法演算法本身是一種函數(shù)範(fàn)本不可變序列演算法(non-mutatingalgorithms)不直接修改所操作的容器內(nèi)容的演算法可變序列演算法(mutatingalgorithms)可以修改它們所操作的容器的元素。排序相關(guān)演算法數(shù)值演算法*算法演算法應(yīng)用舉例例10-9應(yīng)用不可變序列演算法對(duì)數(shù)據(jù)序列進(jìn)行分析例10-10以可變序列演算法對(duì)數(shù)據(jù)序列進(jìn)行複製,生成,刪除,替換,倒序,旋轉(zhuǎn)等可變性操作。例10-11應(yīng)用排序相關(guān)演算法對(duì)序列進(jìn)行各項(xiàng)操作例10-12應(yīng)用數(shù)值演算法對(duì)數(shù)據(jù)序列進(jìn)行操作*算法函數(shù)對(duì)象一個(gè)行為類似函數(shù)的對(duì)象,它可以沒有參數(shù),也可以帶有若干參數(shù),其功能是獲取一個(gè)值,或者改變操作的狀態(tài)。任何普通的函數(shù)和任何重載了調(diào)用運(yùn)算符operator()的類的對(duì)象都滿足函數(shù)對(duì)象的特徵STL中也定義了一些標(biāo)準(zhǔn)的函數(shù)對(duì)象,如果以功能劃分,可以分為算術(shù)運(yùn)算、關(guān)係運(yùn)算、邏輯運(yùn)算三大類。為了調(diào)用這些標(biāo)準(zhǔn)函數(shù)對(duì)象,需要包含頭檔<functional>。*小結(jié)與復(fù)習(xí)建議主要內(nèi)容泛型程式設(shè)計(jì)、與標(biāo)準(zhǔn)範(fàn)本庫有關(guān)的概念和術(shù)語、C++標(biāo)準(zhǔn)範(fàn)本庫中的容器、迭代器、標(biāo)準(zhǔn)C++庫中的演算法、函數(shù)對(duì)象達(dá)到的目標(biāo)初步瞭解泛型程式設(shè)計(jì)的概念,學(xué)會(huì)C++標(biāo)準(zhǔn)範(fàn)本庫(STL)的使用方法實(shí)驗(yàn)任務(wù)實(shí)驗(yàn)十*
C++程式的結(jié)構(gòu)
函數(shù)原型的作用域函數(shù)原型中的參數(shù),其作用域始於
"(",結(jié)束於")"。例如,設(shè)有下列原型聲明:doublearea(doubleradius);*radius的作用域僅在於此,不能用於程式正文其他地方,因而可有可無。作用域與可見性局部作用域函數(shù)的形參,在塊中聲明的識(shí)別字,其作用域自聲明處起,限於塊中,例如:voidfun(inta){intb=a;cin>>b;if(b>0){intc;
}}*c的作用域b的作用域作用域與可見性a的作用域類作用域類作用域作用於特定的成員名。類X的成員m具有類作用域,對(duì)m的訪問方式如下:如果在X的成員函數(shù)中沒有聲明同名的局部作用域識(shí)別字,那麼在該函數(shù)內(nèi)可以訪問成員m。通過運(yùn)算式x.m或者X::m訪問。通過運(yùn)算式ptr->m*作用域與可見性檔作用域不在前述各個(gè)作用域中出現(xiàn)的聲明,具有檔作用域,這樣聲明的識(shí)別字的作用域開始於聲明點(diǎn),結(jié)束於檔尾。*作用域與可見性可見性可見性是從對(duì)識(shí)別字的引用的角度來談的概念可見性表示從內(nèi)層作用域向外層作用域“看”時(shí)能看見什麼。如果標(biāo)識(shí)在某處可見,則就可以在該處引用此識(shí)別字。*塊作用域類作用域檔作用域作用域與可見性可見性識(shí)別字應(yīng)聲明在先,引用在後。如果某個(gè)識(shí)別字在外層中聲明,且在內(nèi)層中沒有同一識(shí)別字的聲明,則該識(shí)別字在內(nèi)層可見。對(duì)於兩個(gè)嵌套的作用域,如果在內(nèi)層作用域內(nèi)聲明了與外層作用域中同名的識(shí)別字,則外層作用域的識(shí)別字在內(nèi)層不可見。*作用域與可見性同一作用域中的同名識(shí)別字在同一作用域內(nèi)的對(duì)象名、函數(shù)名、枚舉常量名會(huì)隱藏同名的類名或枚舉類型名。重載的函數(shù)可以有相同的函數(shù)名。*作用域與可見性例5.1#include<iostream>usingnamespacestd;inti;//檔作用域intmain(){
i=5;{inti;//塊作用域
i=7;cout<<"i="<<i<<endl;//輸出7}
cout<<"i="<<i;//輸出5
return0;}*作用域與可見性對(duì)象的生存期對(duì)象從產(chǎn)生到結(jié)束的這段時(shí)間就是它的生存期。在對(duì)象生存期內(nèi),對(duì)象將保持它的值,直到被更新為止。*靜態(tài)生存期這種生存期與程式的運(yùn)行期相同。在檔作用域中聲明的對(duì)象具有這種生存期。在函數(shù)內(nèi)部聲明靜態(tài)生存期對(duì)象,要冠以關(guān)鍵字static
。*對(duì)象的生存期例#include<iostream>usingnamespacestd;inti=5;//檔作用域intmain(){cout<<"i="<<i<<endl;return0;}i具有靜態(tài)生存期*對(duì)象的生存期動(dòng)態(tài)生存期塊作用域中聲明的,沒有用static修是的對(duì)象是動(dòng)態(tài)生存期的對(duì)象(習(xí)慣稱局部生存期對(duì)象)。開始於程式執(zhí)行到聲明點(diǎn)時(shí),結(jié)束於命名該識(shí)別字的作用域結(jié)束處。*對(duì)象的生存期例#include<iostream>usingnamespacestd;voidfun();intmain(){fun();fun();}voidfun(){
staticinta=1;inti=5;
a++;
i++;cout<<"i="<<i<<",a="<<a<<endl;}*運(yùn)行結(jié)果:i=6,a=2i=6,a=3i是動(dòng)態(tài)生存期a是靜態(tài)生存期對(duì)象的生存期例5-2變數(shù)的生存期與可見性#include<iostream>usingnamespacestd;inti=1;//i為全局變數(shù),具有靜態(tài)生存期。voidother(){staticinta=2;staticintb;//a,b為靜態(tài)局部變數(shù),具有全局壽命,局部可見。
//只第一次進(jìn)入函數(shù)時(shí)被初始化。
intc=10;//C為局部變數(shù),具有動(dòng)態(tài)生存期,
//每次進(jìn)入函數(shù)時(shí)都初始化。
a+=
2;i+=
32;c+=
5;cout<<"OTHER\n";cout<<"i:"<<i<<"a:"<<a<<"b:"<<b<<"c:"<<c<<endl;
b=a;}*對(duì)象的生存期intmain(){staticinta;//靜態(tài)局部變數(shù),有全局壽命,局部可見。
intb=-10;//b,c為局部變數(shù),具有動(dòng)態(tài)生存期。
intc=0; cout<<"MAIN\n";cout<<"i:"<<i<<"a:"<<a<<"b:"<<b<<"c:"<<c<<endl;c+=8;other();cout<<"MAIN\n";cout<<"i:"<<i<<"a:"<<a<<"b:"<<b<<"c:"<<c<<endl;
i+=
10;other(); return0;}17運(yùn)行結(jié)果:MAIN
i:1
a:0b:-10c:0OTHER
i:33
a:4b:0c:15MAIN
i:33
a:0b:-10c:8OTHER
i:75
a:6b:4c:1518例5-3具有靜態(tài)、動(dòng)態(tài)生存期對(duì)象的時(shí)鐘程式#include<iostream>usingnamespacestd;classClock{ //時(shí)鐘類定義public: //外部介面
Clock(); voidsetTime(intnewH,intnewM,intnewS);//三個(gè)形參均具有函數(shù)原型作用域
voidshowTime();private: //私有數(shù)據(jù)成員
inthour,minute,second;};*對(duì)象的生存期Clock::Clock():hour(0),minute(0),second(0){} //構(gòu)造函數(shù)voidClock::setTime(intnewH,intnewM,intnewS){//三個(gè)形參均具有局部作用域
hour=newH; minute=newM; second=newS;}voidClock::showTime(){ cout<<hour<<":"<<minute<<":"<<second<<endl;}20ClockglobClock;//聲明對(duì)象globClock,
//具有靜態(tài)生存期,檔作用域intmain(){//主函數(shù) cout<<"Firsttimeoutput:"<<endl;
//引用具有檔作用域的對(duì)象:
globClock.showTime();//對(duì)象的成員函數(shù)具有類作用域
globClock.setTime(8,30,30); ClockmyClock(globClock);
//聲明具有塊作用域的對(duì)象myClock cout<<"Secondtimeoutput:"<<endl;
myClock.showTime(); //引用具有塊作用域的對(duì)象 return0;}21程式的運(yùn)行結(jié)果為:Firsttimeoutput:0:0:0Secondtimeoutput:8:30:3022數(shù)據(jù)與函數(shù)數(shù)據(jù)存儲(chǔ)在局部對(duì)象中,通過參數(shù)傳遞實(shí)現(xiàn)共用——函數(shù)間的參數(shù)傳遞。數(shù)據(jù)存儲(chǔ)在全局對(duì)象中。將數(shù)據(jù)和使用數(shù)據(jù)的函數(shù)封裝在類中。*數(shù)據(jù)與函數(shù)使用全局對(duì)象#include<iostream>usingnamespacestd;intglobal;voidf(){global=5;}voidg(){cout<<global<<endl;}intmain(){f();g();//輸出“5”return0;}*數(shù)據(jù)與函數(shù)將函數(shù)與數(shù)據(jù)封裝#include<iostream>usingnamespacestd;classApplication{public:voidf();voidg();private:intglobal;};voidApplication::f(){
global=5;}voidApplication::g(){cout<<global<<endl;}intmain(){ApplicationMyApp;MyApp.f();MyApp.g();return0;}*數(shù)據(jù)與函數(shù)靜態(tài)成員靜態(tài)數(shù)據(jù)成員用關(guān)鍵字static聲明該類的所有對(duì)象維護(hù)該成員的同一個(gè)拷貝必須在類外定義和初始化,用(::)來指明所屬的類。靜態(tài)成員函數(shù)類外代碼可以使用類名和作用域操作符來調(diào)用靜態(tài)成員函數(shù)。靜態(tài)成員函數(shù)只能引用屬於該類的靜態(tài)數(shù)據(jù)成員或靜態(tài)成員函數(shù)。*靜態(tài)成員例5-4
具有靜態(tài)數(shù)據(jù)成員的Point類#include<iostream>usingnamespacestd;classPoint {public: Point(intx=0,inty=0):x(x),y(y){count++;} Point(Point&p); intgetX(){returnx;} intgetY(){returny;} voidshowCount(){ cout<<"Objectcount=“<<count<<endl;}private: intx,y;
staticintcount;};*靜態(tài)成員Point::Point(Point&p){ x=p.x; x=p.y; count++;}intPoint::count=0;
intmain(){ Pointa(4,5); cout<<"PointA:"<<a.getX()<<","<<a.getY(); a.showCount(); Pointb(a); cout<<"PointB:"<<b.getX()<<","<<b.getY(); b.showCount(); return0;}28靜態(tài)成員函數(shù)舉例#include<iostream>usingnamespacestd;classApplication{public:staticvoidf();staticvoidg();private:staticintglobal;};intApplication::global=0;voidApplication::f(){ global=5;}voidApplication::g(){ cout<<global<<endl;}intmain(){ Application::f(); Application::g(); return0;}*靜態(tài)成員靜態(tài)成員函數(shù)舉例classA{public: staticvoidf(Aa);private: intx;};voidA::f(Aa){ cout<<x;//對(duì)x的引用是錯(cuò)誤的 cout<<a.x;//正確}*靜態(tài)成員具有靜態(tài)數(shù)據(jù)、函數(shù)成員的Point類#include<iostream>usingnamespacestd;classPoint{ //Point類定義public: //外部介面
Point(intx=0,inty=0):x(x),y(y){count++;} Point(Point&p); ~Point(){count--;} intgetX(){returnx;} intgetY(){returny;} staticvoidshowCount(){ //靜態(tài)函數(shù)成員
cout<<"Objectcount="<<count<<endl; }private: //私有數(shù)據(jù)成員
intx,y; staticintcount; //靜態(tài)數(shù)據(jù)成員聲明};*靜態(tài)成員Point::Point(Point&p){ x=p.x; y=p.y; count++;}intPoint::count=0;
intmain(){//主函數(shù)實(shí)現(xiàn) Pointa(4,5); //聲明對(duì)象A cout<<"PointA,"<<a.getX()<<","<<a.getY();
Point::showCount(); //輸出對(duì)象個(gè)數(shù)
Pointb(a); //聲明對(duì)象B cout<<"PointB,"<<b.GetX()<<","<<b.GetY();
Point::showCount(); //輸出對(duì)象個(gè)數(shù) return0;}32友元友元是C++提供的一種破壞數(shù)據(jù)封裝和數(shù)據(jù)隱藏的機(jī)制。通過將一個(gè)模組聲明為另一個(gè)模組的友元,一個(gè)模組能夠引用到另一個(gè)模組中本是被隱藏的資訊??梢允褂糜言瘮?shù)和友元類。為了確保數(shù)據(jù)的完整性,及數(shù)據(jù)封裝與隱藏的原則,建議儘量不使用或少使用友元。*
友元友元函數(shù)友元函數(shù)是在類聲明中由關(guān)鍵字friend修飾說明的非成員函數(shù),在它的函數(shù)體中能夠通過對(duì)象名訪問private和protected成員作用:增加靈活性,使程式員可以在封裝和快速性方面做合理選擇。訪問對(duì)象中的成員必須通過對(duì)象名。*
友元例5-6使用友元函數(shù)計(jì)算兩點(diǎn)距離#include<iostream>#include<cmath>classPoint{ //Point類聲明public: //外部介面
Point(intx=0,inty=0):x(x),y(y){} intgetX(){returnx;} intgetY(){returny;}
friendfloatdist(Point&a,Point&b);
private: //私有數(shù)據(jù)成員
intx,y;};*
友元floatdist(Point&a,Point&b){doublex=a.x-b.x;doubley=a.y-b.y;returnstatic_cast<float>(sqrt(x*x+y*y));}intmain(){Pointp1(1,1),p2(4,5);cout<<"Thedistanceis:";cout<<dist(p1,p2)<<endl;return0;}36友元類若一個(gè)類為另一個(gè)類的友元,則此類的所有成員都能訪問對(duì)方類的私有成員。聲明語法:將友元類名在另一個(gè)類中使用friend修飾說明。*
友元友元類舉例classA{friendclassB;public:voiddisplay(){cout<<x<<endl;}private:intx;}classB{public:voidset(inti);voiddisplay();private:
Aa;};*
友元voidB::set(inti){
a.x=i;}voidB::display(){a.display();}39友元關(guān)係是單向的如果聲明B類是A類的友元,B類的成員函數(shù)就可以訪問A類的私有和保護(hù)數(shù)據(jù),但A類的成員函數(shù)卻不能訪問B類的私有、保護(hù)數(shù)據(jù)。*常類型常類型的對(duì)象必須進(jìn)行初始化,而且不能被更新。常對(duì)象:必須進(jìn)行初始化,不能被更新。const類名
對(duì)象名常引用:被引用的對(duì)象不能被更新。const類型說明符&引用名常數(shù)組:數(shù)組元素不能被更新(下一章介紹)。類型說明符const數(shù)組名[大小]...常指針:指向常量的指針(下一章介紹)。*
共用數(shù)據(jù)的保護(hù)常對(duì)象舉例classA{public:A(inti,intj){x=i;y=j;}...private:intx,y;};Aconsta(3,4);//a是常對(duì)象,不能被更新*
共用數(shù)據(jù)的保護(hù)用const修飾的對(duì)象成員常成員函數(shù)使用const關(guān)鍵字說明的函數(shù)。常成員函數(shù)不更新對(duì)象的數(shù)據(jù)成員。常成員函數(shù)說明格式:
類型說明符函數(shù)名(參數(shù)表)const;
這裏,const是函數(shù)類型的一個(gè)組成部分,因此在實(shí)現(xiàn)部分也要帶const關(guān)鍵字。const關(guān)鍵字可以被用於參與對(duì)重載函數(shù)的區(qū)分通過常對(duì)象只能調(diào)用它的常成員函數(shù)。常數(shù)據(jù)成員使用const說明的數(shù)據(jù)成員。*
共用數(shù)據(jù)的保護(hù)例5-7常成員函數(shù)舉例#include<iostream>usingnamespacestd;classR{public:R(intr1,intr2):r1(r1),r2(r2){}voidprint();voidprint()const;private:intr1,r2;};*
共用數(shù)據(jù)的保護(hù)voidR::print(){cout<<r1<<":"<<r2<<endl;}voidR::print()const{cout<<r1<<";"<<r2<<endl;}intmain(){Ra(5,4);a.print();//調(diào)用voidprint()
constRb(20,52);
b.print();//調(diào)用voidprint()const return0;}45例5-8常數(shù)據(jù)成員舉例#include<iostream>usingnamespacestd;classA{public: A(inti); voidprint();private: constinta; staticconstintb;//靜態(tài)常數(shù)據(jù)成員};*
共用數(shù)據(jù)的保護(hù)constintA::b=10;A::A(inti):a(i){}voidA::print(){cout<<a<<":"<<b<<endl;}intmain(){/*建立對(duì)象a和b,並以100和0作為初值,分別調(diào)用構(gòu)造函數(shù),通過構(gòu)造函數(shù)的初始化列表給對(duì)象的常數(shù)據(jù)成員賦初值*/Aa1(100),a2(0);a1.print();a2.print();return0;}47例5-9常引用作形參#include<iostream>#include<cmath>usingnamespacestd;classPoint{ //Point類定義public: //外部介面
Point(intx=0,inty=0):x(x),y(y){} intgetX(){returnx;} intgetY(){returny;} friendfloatdist(constPoint&p1,constPoint&p2);private: //私有數(shù)據(jù)成員
intx,y;};*
共用數(shù)據(jù)的保護(hù)例5-9常引用作形參floatdist(constPoint&p1,constPoint&p2){
doublex=p1.x-p2.x; doubley=p1.y-p2.y; returnstatic_cast<float>(sqrt(x*x+y*y));}intmain(){ //主函數(shù)
constPointmyp1(1,1),myp2(4,5);
cout<<"Thedistanceis:"; cout<<dist(myp1,myp2)<<endl;
return0;}*
共用數(shù)據(jù)的保護(hù)編譯預(yù)處理命令#include包含指令將一個(gè)原始檔案嵌入到當(dāng)前原始檔案中該點(diǎn)處。#include<檔案名>按標(biāo)準(zhǔn)方式搜索,檔位於C++系統(tǒng)目錄的include子目錄下#include"檔案名"首先在當(dāng)前目錄中搜索,若沒有,再按標(biāo)準(zhǔn)方式搜索。#define宏定義指令定義符號(hào)常量,很多情況下已被const定義語句取代。定義帶參數(shù)宏,已被內(nèi)聯(lián)函數(shù)取代。#undef刪除由#define定義的宏,使之不再起作用。*條件編譯指令
#if和#endif#if
常量運(yùn)算式
//當(dāng)“常量運(yùn)算式”非零時(shí)編譯程式正文#endif*
編譯預(yù)處理命令條件編譯指令——#else #if常量運(yùn)算式
//當(dāng)“常量運(yùn)算式”非零時(shí)編譯程式正文1#else
//當(dāng)“常量運(yùn)算式”為零時(shí)編譯程式正文2#endif*
編譯預(yù)處理命令條件編譯指令#elif#if常量運(yùn)算式1
程式正文1
//當(dāng)“常量運(yùn)算式1”非零時(shí)編譯#elif常量運(yùn)算式2
程式正文2
//當(dāng)“常量運(yùn)算式2”非零時(shí)編譯#else
程式正文3
//其他情況下編譯#endif*
編譯預(yù)處理命令條件編譯指令#ifdef識(shí)別字程式段1#else
程式段2#endif如果“識(shí)別字”經(jīng)#defined定義過,且未經(jīng)undef刪除,則編譯程序段1,否則編譯程序段2。*
編譯預(yù)處理命令條件編譯指令#ifndef識(shí)別字程式段1#else
程式段2#endif如果“識(shí)別字”未被定義過,則編譯程序段1,否則編譯程序段2。*
編譯預(yù)處理命令多檔結(jié)構(gòu)(例5-10)一個(gè)根源程式可以劃分為多個(gè)原始檔案:類聲明檔(.h檔)類實(shí)現(xiàn)檔(.cpp檔)類的使用檔(main()所在的.cpp檔)利用工程來組合各個(gè)檔。*不使用條件編譯的頭檔//main.cpp#include"file1.h"#include"file2.h"intmain(){…}//file1.h#include"head.h"…//file2.h#include"head.h"…//head.h…classPoint{…}…*
多檔結(jié)構(gòu)使用條件編譯的頭檔//head.h#ifndefHEAD_H#defineHEAD_H…classPoint{…}…#endif*
多檔結(jié)構(gòu)常成員函數(shù)的聲明原則適當(dāng)?shù)貙⒊蓡T函數(shù)聲明為常成員函數(shù),能夠提高代碼品質(zhì)。凡是不會(huì)改變對(duì)象狀態(tài)的函數(shù),都應(yīng)當(dāng)聲明為常成員函數(shù)。什麼是改變對(duì)象狀態(tài)?改變對(duì)象狀態(tài),不簡(jiǎn)單地等同於改變成員數(shù)據(jù)的值。只要一個(gè)成員函數(shù)執(zhí)行與否,不會(huì)影響以後介面函數(shù)的調(diào)用結(jié)果,都可以認(rèn)為它不會(huì)改變對(duì)象狀態(tài)。*深度探索常成員函數(shù)的聲明原則classLine{ //Line類的定義public: //外部介面
Line(constPoint&p1,constPoint&p2):p1(p1),p2(p2),len(-1){} doublegetLen();private: //私有數(shù)據(jù)成員
Pointp1,p2; //Point類的對(duì)象p1,p2 doublelen;};doubleLine::getLen(){ if(len<0){ doublex=p1.getX()-p2.getX(); doubley=p1.getY()-p2.getY(); len=sqrt(x*x+y*y); } returnlen;}*深度探索改變數(shù)據(jù)成員,但不改變對(duì)象狀態(tài)常成員函數(shù)的聲明原則在原則上,應(yīng)當(dāng)將getLen聲明為常成員函數(shù),但由於修改了數(shù)據(jù)成員的值,語言規(guī)則不允許怎麼辦?使用mutable關(guān)鍵字mutable關(guān)鍵字使得被修飾的成員對(duì)象無視“常對(duì)象的成員對(duì)象被視為常對(duì)象”這一語言原則Mutable須慎用*深度探索代碼的編譯連接與執(zhí)行編譯:原始檔案
目標(biāo)檔原始檔案的函數(shù)代碼
目標(biāo)檔的代碼段原始檔案的靜態(tài)對(duì)象
目標(biāo)檔的數(shù)據(jù)段分為初始化的數(shù)據(jù)段和未初始化的數(shù)據(jù)段符號(hào)表:將靜態(tài)對(duì)象與函數(shù)的名字與地址關(guān)聯(lián)重定位記錄表:將代碼中需用到的地址與符號(hào)表關(guān)聯(lián)連接將各段合併將符號(hào)表合併根據(jù)重定位記錄表,確定代碼中用到的全局地址*深度探索代碼的編譯連接與執(zhí)行代碼的執(zhí)行操作系統(tǒng)首先將檔從磁片讀入,初始化各段——一些靜態(tài)數(shù)據(jù)就在此時(shí)被初始化從引導(dǎo)代碼開始執(zhí)行,引導(dǎo)代碼啟動(dòng)main,main返回後,引導(dǎo)代碼會(huì)通知操作系統(tǒng)程式結(jié)束為什麼只有靜態(tài)對(duì)象需要在目標(biāo)檔中保存資訊?連接器負(fù)責(zé)為靜態(tài)對(duì)象分配唯一地址,而其他對(duì)象都是相對(duì)尋址為什麼類的資訊不存在於目標(biāo)檔中?類的“解構(gòu)”*深度探索小結(jié)與復(fù)習(xí)建議主要內(nèi)容作用域與可見性、對(duì)象的生存期、數(shù)據(jù)的共用與保護(hù)、友元、編譯預(yù)處理命令、多檔結(jié)構(gòu)和工程達(dá)到的目標(biāo)深入理解程式的結(jié)構(gòu)、模組間的關(guān)係、數(shù)據(jù)共用。實(shí)驗(yàn)任務(wù)實(shí)驗(yàn)五*C++簡(jiǎn)單程式設(shè)計(jì)
C++語言的產(chǎn)生C++是從C語言發(fā)展演變而來的,首先是一個(gè)更好的C引入了類的機(jī)制,最初的C++被稱為“帶類的C”1983年正式取名為C++從1989年開始C++語言的標(biāo)準(zhǔn)化工作於1994年制定了ANSIC++標(biāo)準(zhǔn)草案於1998年11月被國(guó)際標(biāo)準(zhǔn)化組織(ISO)批準(zhǔn)為國(guó)際標(biāo)準(zhǔn),成為目前的C++*C++語言概述C++的特點(diǎn)全面相容C它保持了C的簡(jiǎn)潔、高效和接近組合語言等特點(diǎn)對(duì)C的類型系統(tǒng)進(jìn)行了改革和擴(kuò)充C++也支持面向過程的程式設(shè)計(jì),不是一個(gè)純正的面向?qū)ο蟮恼Z言支持面向?qū)ο蟮姆椒?C++語言概述C++程式實(shí)例—例2-1//2_1.cpp#include<iostream>usingnamespacestd;intmain(){ cout<<"Hello!"<<endl; cout<<"Welcometoc++!"<<endl; return0;}運(yùn)行結(jié)果:Hello!Welcometoc++!*C++語言概述C++字元集大小寫的英文字母:A~Z,a~z數(shù)字字元:0~9特殊字元:
! # % ^ & * _ + = - ~ < > / \ ‘
“ ; . , : ? ( ) [ ] { }*C++語言概述詞法記號(hào)關(guān)鍵字
C++預(yù)定義的單詞識(shí)別字
程式員聲明的單詞,它命名程式正文中的一些實(shí)體文字
在程式中直接使用符號(hào)表示的數(shù)據(jù)操作符
用於實(shí)現(xiàn)各種運(yùn)算的符號(hào)分隔符號(hào)
(){},:;
用于分隔各個(gè)詞法記號(hào)或程序正文空白符 空格、跳位字元(TAB鍵產(chǎn)生的字元)、垂直跳位字元、換行符、回車符和注釋的總稱*C++語言概述識(shí)別字的構(gòu)成規(guī)則以大寫字母、小寫字母或下劃線(_)開始??梢杂梢源髮懽帜浮⑿懽帜?、下劃線(_)或數(shù)字0~9組成。大寫字母和小寫字母代表不同的識(shí)別字。*C++語言概述
數(shù)據(jù)類型
——常量與變數(shù)#include<iostream>usingnamespacestd;intmain(){constintPRICE=30;intnum,total;floatv,r,h;num=10;total=num*PRICE;cout<<total<<endl;r=2.5;h=3.2;v=3.14159*r*r*h;cout<<v<<endl;return0;}*常量變數(shù)變數(shù)先聲明後使用符號(hào)常量基本數(shù)據(jù)類型和運(yùn)算式
數(shù)據(jù)類型
——整型數(shù)據(jù)#include<iostream>usingnamespacestd;intmain(){constintPRICE=30;intnum,total;floatv,r,h;num=10;total=num*PRICE;cout<<total<<endl;r=2.5;h=3.2;v=3.14159*r*r*h;cout<<v<<endl;return0;}*shortunsignedshort2位元組intunsignedint
4字節(jié)longunsignedlong4位元組整型變數(shù)聲明基本數(shù)據(jù)類型和運(yùn)算式整型變數(shù)整型常量數(shù)據(jù)類型
—整數(shù)數(shù)據(jù)及取值範(fàn)圍類型 說明符 位數(shù) 數(shù)值範(fàn)圍 短整 short 16 -32768~32767基本 int 32 -231~(231-1)長(zhǎng)整 long 32 -231~(231-1)無符號(hào)
unsignedshort 16 0~65535
unsigned[int] 32 0~(232-1)
unsignedlong 32 0~(232-1) *基本數(shù)據(jù)類型和運(yùn)算式
數(shù)據(jù)類型
——實(shí)數(shù)數(shù)據(jù)#include<iostream>usingnamespacestd;intmain(){constintPRICE=30;intnum,total;floatv,r,h;num=10;total=num*PRICE;cout<<total<<endl;r=2.5;h=3.2;v=3.14159*r*r*h;cout<<v<<endl;return0;}*實(shí)型常量float4位元組
3.4×10±387位有效數(shù)字double8位元組
1.7×10±30815位有效數(shù)字longdouble8位元組
1.7×10±30815位有效數(shù)字實(shí)型變數(shù)默認(rèn)為double型尾碼F(或f)
為float型尾碼L(或l)
為longdouble
型基本數(shù)據(jù)類型和運(yùn)算式
數(shù)據(jù)類型
——字元數(shù)據(jù)(一)字元常量單引號(hào)括起來的一個(gè)字元,
如:'a','D','?','$'字元變數(shù)用來存放字元常量
例:charc1,c2;
c1='a';
c2='A';字符數(shù)據(jù)在內(nèi)存中的存儲(chǔ)形式以ASCII碼存儲(chǔ),占1位元組,用7個(gè)二進(jìn)位位*基本數(shù)據(jù)類型和運(yùn)算式
數(shù)據(jù)類型
——字元型數(shù)據(jù)(二)字元數(shù)據(jù)的使用方法字元數(shù)據(jù)和整型數(shù)據(jù)之間可以運(yùn)算。字元數(shù)據(jù)與整型數(shù)據(jù)可以互相賦值。字串常量例:"CHINA"
"a"
'a'所以:charc;
c="a";*CHINA\0a
\0aPage*基本數(shù)據(jù)類型和運(yùn)算式
數(shù)據(jù)類型
——布爾型數(shù)據(jù)布爾型變數(shù)的說明:
例:boolflag;布爾型數(shù)據(jù)的取值:
只有false
和true
兩個(gè)值*基本數(shù)據(jù)類型和運(yùn)算式
數(shù)據(jù)類型
——變數(shù)初始化例:
inta=3;
doublef=3.56;
charc='a';
intc(5);*Page*基本數(shù)據(jù)類型和運(yùn)算式數(shù)據(jù)類型
—混合運(yùn)算時(shí)的類型轉(zhuǎn)換不同類型數(shù)據(jù)進(jìn)行混合運(yùn)算時(shí),C++編譯器會(huì)自動(dòng)進(jìn)行類型轉(zhuǎn)換。為了避免不同的數(shù)據(jù)類型在運(yùn)算中出現(xiàn)類型問題,應(yīng)儘量使用同種類型數(shù)據(jù)??梢話裼脧?qiáng)制類型轉(zhuǎn)換:例如:
floatc;
inta,b;
c=float(a)/float(b);或c=(float)a/(float)b;
*基本數(shù)據(jù)類型和運(yùn)算式變數(shù)的存儲(chǔ)類型auto屬於一時(shí)性存儲(chǔ),其存儲(chǔ)空間可以被若干變數(shù)多次覆蓋使用。register存放在通用寄存器中。extern在所有函數(shù)和程式段中都可引用。static在內(nèi)存中是以固定地址存放的,在整個(gè)程式運(yùn)行期間都有效。*基本數(shù)據(jù)類型和運(yùn)算式算術(shù)運(yùn)算符與算術(shù)運(yùn)算式基本算術(shù)運(yùn)算符
+-*/(若整數(shù)相除,結(jié)果取整)%(取餘,運(yùn)算元為整數(shù))優(yōu)先順序與結(jié)合性先乘除,後加減,同級(jí)自左至右++,--(自增、自減)例:i++;--j;*Page*基本數(shù)據(jù)類型和運(yùn)算式賦值運(yùn)算符和賦值運(yùn)算式
簡(jiǎn)單的賦值運(yùn)算符"="舉例
n=n+5運(yùn)算式的類型
賦值運(yùn)算符左邊對(duì)象的類型運(yùn)算式的值
賦值運(yùn)算符左邊對(duì)象被賦值後的值*Page*基本數(shù)據(jù)類型和運(yùn)算式賦值運(yùn)算符和賦值運(yùn)算式
復(fù)合的賦值運(yùn)算符有10種複合運(yùn)算符:
+=,-=,*=,/=,%=,
<<=,>>=,&=,^=,|=例
a+=3
等價(jià)於a=a+3
x*=y+8
等價(jià)於x=x*(y+8)*基本數(shù)據(jù)類型和運(yùn)算式逗號(hào)運(yùn)算和逗號(hào)運(yùn)算式格式運(yùn)算式1,運(yùn)算式2求解順序及結(jié)果先求解1,再求解2,最終結(jié)果為運(yùn)算式2的值例a=3*5,a*4
最終結(jié)果為60*Page*基本數(shù)據(jù)類型和運(yùn)算式關(guān)係運(yùn)算與關(guān)係運(yùn)算式關(guān)係運(yùn)算是比較簡(jiǎn)單的一種邏輯運(yùn)算,優(yōu)先次序?yàn)椋?/p>
<<=>>===!=
優(yōu)先順序相同(高)優(yōu)先順序相同(低)關(guān)係運(yùn)算式是一種最簡(jiǎn)單的邏輯運(yùn)算式其結(jié)果類型為bool,值只能為true
或false。例如:a>b,c<=a+b,x+y==3*基本數(shù)據(jù)類型和運(yùn)算式邏輯運(yùn)算與邏輯運(yùn)算式邏輯運(yùn)算符
!(非)&&(與)||(或)
優(yōu)先次序:高→低邏輯運(yùn)算式
例如:(a>b)&&(x>y)
其結(jié)果類型為bool,值只能為true
或false*基本數(shù)據(jù)類型和運(yùn)算式邏輯運(yùn)算與邏輯運(yùn)算式“&&”
的“短路特性”運(yùn)算式1&&運(yùn)算式2先求解運(yùn)算式1若運(yùn)算式1的值為false,則最終結(jié)果為false,不再求解運(yùn)算式2若運(yùn)算式1的結(jié)果為true,則求解運(yùn)算式2,以運(yùn)算式2的結(jié)果作為最終結(jié)果“||”也具有類似的特性*基本數(shù)據(jù)類型和運(yùn)算式條件運(yùn)算符與條件運(yùn)算式一般形式運(yùn)算式1?運(yùn)算式2:運(yùn)算式3運(yùn)算式1必須是bool類型執(zhí)行順序先求解運(yùn)算式1,若運(yùn)算式1的值為true,則求解運(yùn)算式2,運(yùn)算式2的值為最終結(jié)果若運(yùn)算式1的值為false,則求解運(yùn)算式3,運(yùn)算式3的值為最終結(jié)果例:x=a>b?a:b;*基本數(shù)據(jù)類型和運(yùn)算式條件運(yùn)算符與條件運(yùn)算式注意:條件運(yùn)算符優(yōu)先順序高於賦值運(yùn)算符,低於邏輯運(yùn)算符運(yùn)算式2、3的類型可以不同,條件運(yùn)算式的最終類型為2和3中較高的類型。例:x=a>b?a:b;*基本數(shù)據(jù)類型和運(yùn)算式①②sizeof運(yùn)算符語法形式
sizeof(類型名)
或sizeof運(yùn)算式結(jié)果值:
“類型名”所指定的類型或“運(yùn)算式”的結(jié)果類型所占的位元組數(shù)。例:sizeof(short)sizeofx*基本數(shù)據(jù)類型和運(yùn)算式位運(yùn)算——按位與(&)運(yùn)算規(guī)則將兩個(gè)運(yùn)算量的每一個(gè)位進(jìn)行邏輯與操作舉例:計(jì)算3&53:000000115:(&)000001013&5:00000001用途:將某一位置0,其他位不變。例如:
將char型變數(shù)a的最低位置0:
a=a&0xfe;取指定位。
例如:有charc;inta;
取出a的低位元組,置於c中:c=a&0xff;*基本數(shù)據(jù)類型和運(yùn)算式位運(yùn)算——按位或(|)運(yùn)算規(guī)則將兩個(gè)運(yùn)算量的每一個(gè)位進(jìn)行邏輯或操作舉例:計(jì)算3|53:000000115:(|)000001013|5:00000111用途:將某些位置1,其他位不變。
例如:將int
型變數(shù)a
的低位元組置
1
:
a=a|0xff;*基本數(shù)據(jù)類型和運(yùn)算式位運(yùn)算——按位異或(^)運(yùn)算規(guī)則兩個(gè)運(yùn)算元進(jìn)行異或:
若對(duì)應(yīng)位相同,則結(jié)果該位為0,
若對(duì)應(yīng)位不同,則結(jié)果該位為1,舉例:計(jì)算071^052071: 00111001052:(^)00101010071^052: 00010011*基本數(shù)據(jù)類型和運(yùn)算式位運(yùn)算——按位異或(^)用途:使特定位翻轉(zhuǎn)(與0異或保持原值,與1異或取反)例如:要使01111010
低四位翻轉(zhuǎn):
01111010(^) 00001111 01110101*基本數(shù)據(jù)類型和運(yùn)算式位運(yùn)算——取反(~)單目運(yùn)算符,對(duì)一個(gè)二進(jìn)位數(shù)按位取反。例:025:0000000000010101~025:1111111111101010*基本數(shù)據(jù)類型和運(yùn)算式位運(yùn)算——移位左移運(yùn)算(<<)左移後,低位補(bǔ)0,高位捨棄。右移運(yùn)算(>>)右移後,低位:捨棄高位:無符號(hào)數(shù):補(bǔ)0
有符號(hào)數(shù):補(bǔ)“符號(hào)位”*基本數(shù)據(jù)類型和運(yùn)算式運(yùn)算符優(yōu)先順序括弧++,--,sizeof*,/,%+,-==,!=位運(yùn)算&&||?:賦值運(yùn)算逗號(hào)運(yùn)算*低高基本數(shù)據(jù)類型和運(yùn)算式混合運(yùn)算時(shí)數(shù)據(jù)類型的轉(zhuǎn)換
——隱含轉(zhuǎn)換一些二元運(yùn)算符(算術(shù)運(yùn)算符、關(guān)係運(yùn)算符、邏輯運(yùn)算符、位運(yùn)算符和賦值運(yùn)算符)要求兩個(gè)運(yùn)算元的類型一致。在算術(shù)運(yùn)算和關(guān)係運(yùn)算中如果參與運(yùn)算的運(yùn)算元類型不一致,編譯系統(tǒng)會(huì)自動(dòng)對(duì)數(shù)據(jù)進(jìn)行轉(zhuǎn)換(即隱含轉(zhuǎn)換),基本原則是將低類型數(shù)據(jù)轉(zhuǎn)換為高類型數(shù)據(jù)。
char,short,int,unsigned,long,unsignedlong,float,double
低高*基本數(shù)據(jù)類型和運(yùn)算式混合運(yùn)算時(shí)數(shù)據(jù)類型的轉(zhuǎn)換
——隱含轉(zhuǎn)換當(dāng)參與運(yùn)算的運(yùn)算元必須是bool型時(shí),如果運(yùn)算元是其他類型,編譯系統(tǒng)會(huì)自動(dòng)將非0數(shù)據(jù)轉(zhuǎn)換為true,0轉(zhuǎn)換為false。位運(yùn)算的運(yùn)算元必須是整數(shù),當(dāng)二元位運(yùn)算的運(yùn)算元是不同類型的整數(shù)時(shí),也會(huì)自動(dòng)進(jìn)行類型轉(zhuǎn)換,賦值運(yùn)算要求左值與右值的類型相同,若類型不同,編譯系統(tǒng)會(huì)自動(dòng)將右值轉(zhuǎn)換為左值的類型。*基本數(shù)據(jù)類型和運(yùn)算式混合運(yùn)算時(shí)數(shù)據(jù)類型的轉(zhuǎn)換
——顯式轉(zhuǎn)換語法形式(3種):類型說明符(運(yùn)算式)(類型說明符)運(yùn)算式類型轉(zhuǎn)換操作符<類型說明符>(運(yùn)算式)類型轉(zhuǎn)換操作符可以是:
const_cast、dynamic_cast、
reinterpret_cast、static_cast顯式類型轉(zhuǎn)換的作用是將運(yùn)算式的結(jié)果類型轉(zhuǎn)換為類型說明符所指定的類型。例:int(z),(int)z,static_cast<int>(z)
三種完全等價(jià)*基本數(shù)據(jù)類型和運(yùn)算式語句空語句聲明語句運(yùn)算式語句複合語句選擇語句迴圈語句跳轉(zhuǎn)語句標(biāo)號(hào)語句
*運(yùn)算式語句格式:運(yùn)算式;運(yùn)算式語句與運(yùn)算式的區(qū)別:運(yùn)算式可以包含在其他運(yùn)算式中,而語句不可。例如:if((a=b)>0)t=a;不可寫為:if((a=b;)>0)t=a;*語句複合語句將多個(gè)語句用一對(duì)大括弧包圍,便構(gòu)成一個(gè)複合語句例如{ sum=sum+i; i++;} *語句簡(jiǎn)單的輸入、輸出向標(biāo)準(zhǔn)輸出設(shè)備(顯示器)輸出例:intx;cout<<"x="<<x;從標(biāo)準(zhǔn)輸入設(shè)備(鍵盤)輸入例:intx;cin>>x;*演算法的基本控制結(jié)構(gòu)順序結(jié)構(gòu)分支結(jié)構(gòu)迴圈結(jié)構(gòu)*如何解決分支問題?例2-2輸入一個(gè)年份,判斷是否閏年。*演算法的基本控制結(jié)構(gòu)#include<iostream>usingnamespacestd;intmain()
{ intyear;boolIsLeapYear;cout
<<
"Entertheyear:";cin
>>
year; IsLeapYear=((year%4==0&&
year%100!=0)
||
(year%400==0));
if(IsLeapYear)
cout
<<
year
<<
"isaleapyear“
<<
endl;
else
cout
<<
year
<<
"isnotaleapyear“
<<endl; return0;}*運(yùn)行結(jié)果:Entertheyear:20002000isaleapyear*if語句
——三種形式if(運(yùn)算式)語句例:if(x>y)cout<<x;if(運(yùn)算式)語句1else語句2例:if(x>y)cout<<x;elsecout<<y;if(運(yùn)算式1)語句1
elseif(表達(dá)式2)語句2
elseif(表達(dá)式3)語句3
…
else語句n*演算法的基本控制結(jié)構(gòu)如何解決多分問題?例2-3輸入兩個(gè)整數(shù),比較兩個(gè)數(shù)的大小。*演算法的基本控制結(jié)構(gòu)#include<iostream>usingnamespacestd;intmain(){ intx,y; cout<<"Enterxandy:"; cin>>x>>y; if(x!=y) if(x>y) cout<<"x>y"<<endl; else cout<<"x<y"<<endl; else cout<<"x=y"<<endl; return0;}*運(yùn)行結(jié)果1:Enterxandy:58x<y運(yùn)行結(jié)果2:Enterxandy:88x=y運(yùn)行結(jié)果3:Enterxandy:128x>y*一般形式if()if()語句1else語句2elseif()語句3else語句4注意語句1、2、3、4可以是複合語句,每層的if與else配對(duì),或用{}來確定層次關(guān)係。*if語句
——嵌套演算法的基本控制結(jié)構(gòu)特殊的多分支結(jié)構(gòu)例2-4輸入一個(gè)0~6的整數(shù),轉(zhuǎn)換成星期輸出。*演算法的基本控制結(jié)構(gòu)#include<iostream>usingnamespacestd;intmain()
{
intday; cin>>day; switch(day)
{
case0:
cout
<<
"Sunday"
<<
endl;
break;
case1:
cout
<<
"Monday"
<<
endl;
break;
case2:
cout
<<
"Tuesday"
<<
endl;
break;
case3:cout
<<
"Wednesday"
<<
endl;
break;
case4:
cout
<<
"Thursday"
<<
endl;
break;
case5:
cout
<<
"Friday"
<<
endl;
break;
case6:
cout
<<
"Saturday"
<<
endl;
break;
default:
cout
<<
"DayoutofrangeSunday..Saturday"
<<
endl;
break; } return0;}*switch語句一般形式switch(運(yùn)算式){case常量運(yùn)算式1:語句1case常量運(yùn)算式2:語句2┆case常量運(yùn)算式n:語句ndefault:語句n+1}*執(zhí)行順序以case中的常量運(yùn)算式值為入口標(biāo)號(hào),由此開始順序執(zhí)行。因此,每個(gè)case分支最後應(yīng)該加break語句。每個(gè)常量運(yùn)算式的值不能相同,次序不影響執(zhí)行結(jié)果。可以是多個(gè)語句,但不必用{}。可以是整型、字元型、枚舉型演算法的基本控制結(jié)構(gòu)使用switch語句應(yīng)注意的問題case分支可包含多個(gè)語句,且不用{}。運(yùn)算式、判斷值都是int型或char型。若干分支執(zhí)行內(nèi)容相同可共用一組語句。*演算法的基本控制結(jié)構(gòu)如何有效地完成重複工作例2-5求自然數(shù)1~10之和分析:本題需要用累加演算法,累加過程是一個(gè)迴圈過程,可以用while語句實(shí)現(xiàn)。*演算法的基本控制結(jié)構(gòu)#include<iostream>usingnamespacestd;intmain(){inti=1,sum=0;
while(i<=10){sum+=i;//相當(dāng)於sum=sum+i;i++;
}cout<<"sum="<<sum<<endl; return0;}運(yùn)行結(jié)果:sum=55*while語句形式while(運(yùn)算式)語句
*可以是複合語句,其中必須含有改變條件運(yùn)算式值的語句。執(zhí)行順序先判斷運(yùn)算式的值,若為true時(shí),執(zhí)行語句。演算法的基本控制結(jié)構(gòu)先執(zhí)行循環(huán)體,後判斷條件的情況例2-6
輸入一個(gè)整數(shù),將各位數(shù)字反轉(zhuǎn)後輸出。*演算法的基本控制結(jié)構(gòu)#include<iostream>usingnamespacestd;intmain()
{ intn,right_digit,newnum=0; cout<<"Enterthenumber:"; cin>>n;
cout<<"Thenumberinreverseorderis";
do
{ right_digit=n%10; cout<<right_digit; n/=10;
//相當(dāng)於n=n/10
}while(n!=0);cout<<endl; return0;}*運(yùn)行結(jié)果:Enterthenumber:365Thenumberinreverseorderis563*do-while語句一般形式do語句while(運(yùn)算式)*可以是複合語句,其中必須含有改變條件運(yùn)算式值的語句。執(zhí)行順序先執(zhí)行循環(huán)體語句,後判斷條件。
運(yùn)算式為true時(shí),繼續(xù)執(zhí)行循環(huán)體與while語句的比較:while語句執(zhí)行順序
先判斷表達(dá)式的值,為true時(shí),再執(zhí)行語句演算法的基本控制結(jié)構(gòu)
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 人工智能技術(shù)研發(fā)及授權(quán)使用合同
- 環(huán)保科技項(xiàng)目成果轉(zhuǎn)化合同
- 企業(yè)數(shù)字化改造合作框架合同
- 進(jìn)出口商品銷售合同
- 新一代移動(dòng)通信網(wǎng)絡(luò)基礎(chǔ)設(shè)施建設(shè)投資合同
- 2025年度二手商鋪買賣合同知識(shí)產(chǎn)權(quán)保護(hù)與許可合同
- 2025年度網(wǎng)絡(luò)安全風(fēng)險(xiǎn)評(píng)估工程師聘用合同
- 2025年度環(huán)保型辦公耗材集中采購合同范本
- 2025年度新型建筑工地安全防護(hù)腳手架租賃合同范本模板
- 2025年度酒店旁美容美發(fā)店租賃合同范本
- 小學(xué)班會(huì)-交通安全伴我行(共25張課件)
- 消防安全一懂三會(huì)四能
- 起重吊裝工程安全監(jiān)理細(xì)則模版(3篇)
- 《VAVE價(jià)值工程》課件
- 四川政采評(píng)審專家入庫考試基礎(chǔ)題復(fù)習(xí)試題及答案(一)
- 分享二手房中介公司的薪酬獎(jiǎng)勵(lì)制度
- 安徽省2022年中考道德與法治真題試卷(含答案)
- GB 4793-2024測(cè)量、控制和實(shí)驗(yàn)室用電氣設(shè)備安全技術(shù)規(guī)范
- 廣電雙向網(wǎng)改造技術(shù)建議書
- 項(xiàng)目人員管理方案
- 重大火災(zāi)隱患判定方法
評(píng)論
0/150
提交評(píng)論