版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
9.1面向?qū)ο笏季S
9.1.1
C語言的面向過程思維C語言是一種結(jié)構(gòu)化的面向過程的程序設(shè)計語言,通常采用逐步細化的過程,將待解決的問題功能進行分解,直到能用程序設(shè)計語言提供的工具解決為止。例如,計算圓的面積和周長,
面向過程思維考慮程序的功能是求圓的面積和周長,
采用逐步細化的方法來解決這個問題。首先,輸入圓的半徑或直徑;然后,利用圓的面積和周長公式求出圓的周長和面積;最后;輸出結(jié)果。下一頁返回9.1面向?qū)ο笏季S
9.1.2
C++語言的面向?qū)ο笏季S相比C語言,C++語言最重要的是增加了面向?qū)ο蠊δ?,從而使C++語言從根本上改變了程序設(shè)計的思維方式,成為一種面向?qū)ο蟮某绦蛟O(shè)計語言。
面向?qū)ο蟮某绦蛟O(shè)計方法為程序員提供了創(chuàng)建對象的功能。在解決一個問題時,
程序員首先考慮的是這個問題中存在哪些對象,還需要創(chuàng)建這些對象,并用這些對象解決問題。事實上,
在面向?qū)ο笏季S中,
整數(shù)是一類對象,實數(shù)是另一類對象,這在C語言系統(tǒng)中都已經(jīng)創(chuàng)建。例如:inta,b;其中,int是一種數(shù)據(jù)類型,a和b是int型的兩個對象,這種對象可以進行加、減、乘、除等各種操作。之所以能夠這樣定義與使用,是因為C語言系統(tǒng)已定義了int類型,包括它的各種操作。在面向?qū)ο笏季S中,變量的概念已經(jīng)升級為對象。上一頁下一頁返回9.1面向?qū)ο笏季S
在解決實際問題時,特別是解決非計算問題時,大多數(shù)對象的類型未在系統(tǒng)中創(chuàng)建,需要程序員自己創(chuàng)建對象的類型。例如,計算圓的面積和周長問題,面向?qū)ο笏季S首先考慮該問題處理的對象是圓,而半徑、直徑、面積和周長是圓的特性。那么,創(chuàng)建一個圓對象即可。但C++語言并沒有提供圓這種類型,需要程序員創(chuàng)建這種圓類型,并且創(chuàng)建的圓類型能夠提供半徑、
直徑、
面積和周長等特性。
假定創(chuàng)建了一個圓類型———circle,
當(dāng)需要一個圓時,就可以定義這種圓類型的對象,并使用其相關(guān)特性。例如:circlec;面向?qū)ο蟪绦蛟O(shè)計語言最重要的特性是增加了新類型的創(chuàng)建功能。上一頁下一頁返回9.1面向?qū)ο笏季S
C++語言提供了創(chuàng)建對象類型的方法———類(class),
面向?qū)ο蟮木幊趟季S得以實現(xiàn)。
面向?qū)ο笳Z言可以定義在客觀世界中存在的所有事物類型,從而創(chuàng)建所有類型的對象,實現(xiàn)對客觀世界的模擬。因此,面向?qū)ο蟪绦蛟O(shè)計使程序能夠比較直接地反映問題域的本來面目,程序員能夠利用人類認識事物所采用的一般思維方法來進行軟件開發(fā)。上一頁下一頁返回9.1面向?qū)ο笏季S
9.1.3
面向?qū)ο蟮幕靖拍钤诿嫦驅(qū)ο蟮某绦蛟O(shè)計中,對象是指現(xiàn)實世界中實際存在的事物,可以是具體的(如一輛汽車或一名學(xué)生),也可以是抽象(如一個圓或一門課程)。任一對象都具有屬性(attribute)和行為(behavior)兩個要素。
屬性是對象的靜態(tài)特征,可以用某種數(shù)據(jù)來描述;行為是對象的動態(tài)特征,是對象所表現(xiàn)的行為或具有的功能,可以用某個函數(shù)(操作代碼)來描述。一個對象一般是由一組屬性和一組行為構(gòu)成。例如,一個圓具有的屬性有半徑、直徑、面積、周長等,具有的行為有計算直徑、計算面積、計算周長等。上一頁下一頁返回9.1面向?qū)ο笏季S
客觀世界中的對象是無窮無盡的,但很多對象是同一類的,它們具有相同的特性。例如,客觀世界有很多圓,但它們都屬同一類,具有半徑、直徑、面積和周長等特性;客觀世界有很多人,有中國人、美國人、法國人等,都屬于“人”這個類別,具有人的特性;客觀世界有很多交通工具,有汽車、馬車、飛機、輪船等,都屬于“交通工具”這個類別,都具有交通工具的特性。面向?qū)ο蟪绦蛟O(shè)計將所有同類對象抽象為類(class),
并使用類定義一種數(shù)據(jù)類型。
例如,
定義一個類———圓,
將客觀世界的所有圓抽象到一個類別中,
并將其屬性和行為定義在其中。
因此,
類是對象的抽象,
而對象是類的特例。
假定定義了類———circle,
則可以創(chuàng)建多個這個類的對象:circlec1,c2,c[100];這些對象都具有圓的特性:半徑、直徑、
面積和周長,
都能計算面積、周長等。上一頁返回9.2C++語言對C語言的擴充
C語言是C++語言的基礎(chǔ),C++語言包含了完整的C語言的特征和優(yōu)點,并在此基礎(chǔ)上有不少擴充。接下來,通過一個最小的C++程序來了解C++程序與C程序的區(qū)別。在屏幕上輸出以下內(nèi)容:Hello,World!下一頁返回9.2C++語言對C語言的擴充
其代碼如下:上一頁下一頁返回9.2C++語言對C語言的擴充
從代碼清單可以看出,C++程序與C程序有以下不同之處:(1)按C++標準編譯的文件是cpp文件。(2)C++語言定義了一些頭文件,
這些頭文件包含了程序中必需的或有用的信息。
上面這段程序中,包含了頭文件C++的輸入輸出流庫文件iostream。(3)語句“usingnamespacestd;”告訴編譯器使用std來命名空間。
命名空間是C++中一個相對新的概念。C++標準庫中的類和函數(shù)是在命名空間std中聲明的,因此程序中若使用C++標準庫中的有關(guān)內(nèi)容(此時需要用#include命令行),就要用語句“usingnamespacestd;”進行聲明。(4)執(zhí)行語句“cout<<"HelloWorld";”,
會在屏幕上顯示消息“HelloWorld”,
cout對象由輸入輸出流庫文件iostream定義。上一頁下一頁返回9.2C++語言對C語言的擴充
(5)在C++中,
變量定義比較靈活,
只要在用到變量前對該變量進行聲明定義就行了,位置不做特別要求,打破了C語言的在一個模塊里(函數(shù)、循環(huán)體等)先聲明一切所需變量后才能進行相關(guān)操作的規(guī)定。除了這些基礎(chǔ)之外,本節(jié)將簡單介紹C++對C語言的幾點擴充。上一頁下一頁返回9.2C++語言對C語言的擴充
9.2.1
C++常變量在C語言中,
常用#define宏指令來定義符號常量,
如“#definePI3.1415926;”。實際上,只是在預(yù)編譯時進行字符置換,將字符串PI全部置換為3.1415926。C++語言提供了const定義長變量的方法。語法格式:const類型變量=值;例如:constfloatPI=31415926;該語句定義了常變量PI,它具有變量的屬性。在程序運行期間,變量的值是固定的。上一頁下一頁返回9.2C++語言對C語言的擴充
9.2.2
C++的基本輸入輸出C++為了與C兼容,保留了用scanf和printf函數(shù)進行輸入和輸出
(簡稱I/O)的方法,以便C程序仍然可以在C++的環(huán)境下運行。但是,C++有自己特有的輸入輸出方法。在C++的輸入輸出中,編譯系統(tǒng)對數(shù)據(jù)類型進行嚴格的檢查,凡是類型不正確的數(shù)據(jù)都不可能通過編譯。因此,C++的輸入輸出操作是類型安全(typesafe)的。從操作系統(tǒng)的角度看,每一個與主機相連的輸入輸出設(shè)備都被看作一個文件。程序的輸入是指從輸入文件將數(shù)據(jù)傳送給程序,程序的輸出是指從程序?qū)?shù)據(jù)傳送給輸出文件。上一頁下一頁返回9.2C++語言對C語言的擴充
C++的輸入與輸出包括以下三方面內(nèi)容:(1)對系統(tǒng)指定的標準設(shè)備的輸入和輸出。簡稱標準I/O。(設(shè)備)(2)以外存磁盤(或光盤)文件為對象進行輸入和輸出。
簡稱文件I/O。(文件)(3)對內(nèi)存中指定的空間進行輸入和輸出。
簡稱串I/O。(內(nèi)存)本節(jié)的基本輸入和輸出是指C++的標準I/O。C++標準庫提供了一組豐富的輸入輸出功能。輸入輸出是數(shù)據(jù)傳送的過程,數(shù)據(jù)如流水一樣從一處流向另一處,被形象地稱為流(stream)。
流本質(zhì)是字節(jié)序列。
如果字節(jié)流從設(shè)備(如鍵盤、
磁盤驅(qū)動器、
網(wǎng)絡(luò)連接等)流向內(nèi)存,就稱為輸入操作。如果字節(jié)流從內(nèi)存流向設(shè)備(如顯示屏、打印機、磁盤驅(qū)動器、網(wǎng)絡(luò)連接等),就稱為輸出操作。下面以求圓的面積為例,
對比使用C語言與C++語言實現(xiàn)標準I/O的區(qū)別。上一頁下一頁返回9.2C++語言對C語言的擴充
【例9-1】求圓的面積,分別使用C語言和C++語言實現(xiàn)數(shù)據(jù)的輸入輸出。上一頁下一頁返回9.2C++語言對C語言的擴充
上一頁下一頁返回9.2C++語言對C語言的擴充
在例9-1中,頭文件iostream定義了豐富的對象以實現(xiàn)標準輸入輸出,而頭文件iomanip定義了標準輸出的格式控制功能。輸入輸出庫頭文件及其定義的主要對象如下:1)庫文件iostream該文件定義了cin、cout、cerr和clog對象,分別對應(yīng)于標準輸入流、標準輸出流、非緩沖標準錯誤流和緩沖標準錯誤流。(1)cout對象“連接”
到標準輸出設(shè)備(通常是顯示屏)。
cout與流插入運算符“<<”結(jié)合使用。(2)cin對象附屬到標準輸入設(shè)備(通常是鍵盤)。
cin與流提取運算符“>>”
結(jié)合使用,并過濾不可見字符(如空格、回車、TAB等)。上一頁下一頁返回9.2C++語言對C語言的擴充
(3)cerr?qū)ο蟾綄俚綐藴叔e誤設(shè)備(通常是顯示屏),
但是cerr?qū)ο笫欠蔷彌_的,
且每個流插入cerr都會立即輸出。cerr是與流插入運算符“<<”結(jié)合使用的。(4)clog對象附屬到標準錯誤設(shè)備(通常是顯示屏),
但是clog對象是緩沖的。
這意味著每個流插入clog都會先存儲在緩沖區(qū),直到緩沖區(qū)填滿或者緩沖區(qū)刷新時才會輸出。clog是與流插入運算符“<<”結(jié)合使用的。上一頁下一頁返回9.2C++語言對C語言的擴充
2)庫文件iomanip該文件通過所謂的參數(shù)化的流操縱器(如setw和setprecision)聲明對執(zhí)行標準化I/O有用的服務(wù),使用控制符控制輸出格式。iomanip定義的常用操作符有:(1)setiosflags(longf):啟用指定為f的標志,
f的取值有多種(略)。(2)setiosflags(ios∷fixed):固定的浮點顯示。(3)setiosflags(ios∷scientific):指數(shù)表示。(4)setiosflags(ios∷left):左對齊。(5)setiosflags(ios∷right):右對齊。上一頁下一頁返回9.2C++語言對C語言的擴充
(6)setiosflags(ios∷skipws):忽略前導(dǎo)空白。(7)setiosflags(ios∷uppercase):十六進制數(shù)大寫輸出。(8)setiosflags(ios∷lowercase):十六進制數(shù)小寫輸出。(9)setiosflags(ios∷showpoint):強制顯示小數(shù)點。上一頁下一頁返回9.2C++語言對C語言的擴充
(10)setiosflags(ios∷showpos):輸出正數(shù)時,
給出“+”
號。
(11)setprecision(intp):設(shè)置數(shù)值的精度(四舍五入)。
(12)setw(intw):設(shè)置域?qū)挾葹椋鳌?13)setbase(intbase):設(shè)置數(shù)值的基本數(shù)為base。
(14)resetiosflags(longf):關(guān)閉被指定為f的標志。上一頁下一頁返回9.2C++語言對C語言的擴充
9.2.3
C++修飾符類型C++允許在char、int和double數(shù)據(jù)類型前放置修飾符。修飾符用于改變基本類型的含義,
所以它更能滿足各種情境的需求。
主要的數(shù)據(jù)類型修飾符有:signed(有符號)、
un-signed(無符號)、long、short。修飾符signed、unsigned、long和short可應(yīng)用于整型,signed和unsigned可應(yīng)用于字符型,long可應(yīng)用于雙精度型。修飾符signed和unsigned也可以作為long或short修飾符的前綴。例如,unsignedlongint。
C++允許使用速記符號來聲明無符號短整數(shù)或無符號長整數(shù)。
可以不寫int,
只寫un-signed、short或unsigned、long,int是隱含的。上一頁下一頁返回9.2C++語言對C語言的擴充
例如,下面的兩條語句聲明了整型變量:shortunsignedx; //無符號短整變量shortunsignedinty; //無符號短整變量shortinti; //有符號短整型變量上一頁下一頁返回9.2C++語言對C語言的擴充
【例9-2】C++修飾符使用示例。程序的代碼如下:上一頁下一頁返回9.2C++語言對C語言的擴充
運行結(jié)果:從中可以看出,
shortint數(shù)在code∷blocks編譯環(huán)境中的存儲空間為2字節(jié)。
十六進制數(shù)c350的二進制數(shù)是1100001101010000,該數(shù)的無符號十進制數(shù)是50000。由于該數(shù)的最高位為1,因此該數(shù)的有符號十進制數(shù)是-15536。上一頁下一頁返回9.2C++語言對C語言的擴充
9.2.4
C++字符串C++提供了以下兩種類型的字符串表示形式:C語言風(fēng)格字符串、C++引入的string類型。C語言風(fēng)格的字符串起源于C語言,并在C++中繼續(xù)得到支持,是'\0'終止的一維字符數(shù)組。此外,C++標準庫提供了string類型,增加了更多功能。【例9-3】兩種類型字符串表示形式示例。上一頁下一頁返回9.2C++語言對C語言的擴充
上一頁下一頁返回9.2C++語言對C語言的擴充
上一頁下一頁返回9.2C++語言對C語言的擴充
從中可以看出,string類型的使用方式與字符數(shù)組不同。與普通變量類似,可以在輸入/輸出語句中直接輸入/輸出string類型字符串,也可以使用運算符進行string類型的字符串運算,還可以通過“”運算符調(diào)用string類的成員函數(shù)。1.C++字符串變量的定義與賦值定義與使用字符串,必須在文件開頭包含庫文件。例如:#include<string> //注意與C庫文件引用方式的不同字符串變量的定義方式與其他類型相同。例如:stringstr1="Hello"; //定義str1同時對其初始化stringstr2="World"; //定義str2同時對其初始化stringstr3; //定義str3上一頁下一頁返回9.2C++語言對C語言的擴充
在定義了字符串變量后,就可以對其直接賦值,
這與C字符數(shù)組是不同的。
例如,將字符串變量str3賦值為空串:str3="";也可以使用另一字符串變量進行賦值:str3=str1;在定義字符串變量時,無須確定字符個數(shù),其長度隨其中字符串的長度而改變。上一頁下一頁返回9.2C++語言對C語言的擴充
2.C++字符串變量的運算與字符數(shù)組使用字符串函數(shù)的運算不同,C++字符串可以直接使用運算符。1)加號運算符加號運算符的作用是將兩個字符連接。例如:str3=str1+str2;連接后,str3為“HelloWorld”。2)關(guān)系運算符C++字符串可以直接用==(等于)、>(大于)、<(小于)、!=(不等于)、>=(大于或等于)、<=(小于或等于)等關(guān)系運算符來進行字符串的比較。上一頁下一頁返回9.2C++語言對C語言的擴充
3.C++字符串的輸入/輸出C++字符串可以在輸入/輸出語句中直接輸入/輸出。例如:cout<<"str3:"<<str3<<endl;也可以輸入字符串:cin>>str3;但是,cin只接收一個字符串,遇“空格”“TAB”“回車”都結(jié)束。C++中輸入字符串的方式還有很多,下面介紹幾種常用方式。上一頁下一頁返回9.2C++語言對C語言的擴充
(1)cinget(字符變量名)可以用來接收一個字符。例如:上一頁下一頁返回9.2C++語言對C語言的擴充
運行結(jié)果:輸入:輸出:上一頁下一頁返回9.2C++語言對C語言的擴充
cinget(字符數(shù)組名,接收字符數(shù)目)也可以用來接收一行字符串(包括空格)。
例如:上一頁下一頁返回9.2C++語言對C語言的擴充
運行結(jié)果:輸入:輸出:cinget(無參數(shù))主要是用于舍棄輸入流中的不需要的字符。上一頁下一頁返回9.2C++語言對C語言的擴充
(2)cingetline用于接收一個字符串,可以接收空格并輸出。上一頁下一頁返回9.2C++語言對C語言的擴充
運行結(jié)果:輸入:輸出:cingetline實際上有三個參數(shù),第三個參數(shù)為字符串的結(jié)束符,經(jīng)常省略,系統(tǒng)默認為'\0'。上一頁下一頁返回9.2C++語言對C語言的擴充
(3)getline可以用來接收一個字符串,可以接收空格并輸出,
需包含庫文件string。
get-line和cingetline類似,但是cingetline屬于iostream流,而getline屬于string流。上一頁下一頁返回9.2C++語言對C語言的擴充
運行結(jié)果:輸入:
輸出:上一頁下一頁返回9.2C++語言對C語言的擴充
9.2.5
C++引用C++提供了為變量取別名的功能,
這就是變量的引用(reference)。
引用是C++對C語言的一項重要擴充。1.創(chuàng)建引用創(chuàng)建C++引用的格式:類型&變量1=變量2其中,&是引用聲明符。例如:inta;int&b=a;這就聲明了b是a的引用,即a的別名,使用a和使用b的作用相同,都代表了同一變量。系統(tǒng)不會為引用變量b分配存儲單元,變量a和變量b引用同一內(nèi)存單元。上一頁下一頁返回9.2C++語言對C語言的擴充
引用聲明符與取地址符的寫法類似,但二者操作不同。若&前有類型符,便是引用;否則,便是取地址符。例如:int?p=&a;該語句中的&a為取地址符。上一頁下一頁返回9.2C++語言對C語言的擴充
引用更接近const指針時,必須在創(chuàng)建時進行初始化,可以用變量名初始化,也可以用另一個引用初始化,還可以用常量或表達式初始化,但須用const聲明。一旦引用和某個變量關(guān)聯(lián)起來,該引用就會一直指向該變量。int&d; //聲明引用,但未初始化,錯誤inta=3,b=5;int&c=a; //聲明b是變量a的別名int&d=c; //聲明c是引用b的別名const&e=a+3; //此時系統(tǒng)生成臨時變量,存放a+3的值,e是該臨時變量的別名上一頁下一頁返回9.2C++語言對C語言的擴充
創(chuàng)建引用時,不能創(chuàng)建void類型的引用,不能創(chuàng)建引用的數(shù)組,但可以創(chuàng)建指針變量的引用,也可以將變量的引用賦值給一個指針。void&f=3; //錯誤intg=5;int?p=&g; //聲明指針變量pint?&q=p; //q是指針變量p的別名上一頁下一頁返回9.2C++語言對C語言的擴充
2.引用作為函數(shù)參數(shù)引用作為函數(shù)參數(shù),可以擴充函數(shù)傳遞數(shù)據(jù)的功能。在C語言中,變量名可以作為形參來實現(xiàn)數(shù)據(jù)從實參到形參的單向傳遞;變量指針可以做形參,實現(xiàn)變量地址的傳遞,間接改變實參的數(shù)據(jù)。C++語言將變量的引用作為函數(shù)形參(即形參為是實參的別名),直接實現(xiàn)形參與實參對同一內(nèi)存空間的引用?!纠梗础績蓚€變量值的互換。上一頁下一頁返回9.2C++語言對C語言的擴充
上一頁下一頁返回9.2C++語言對C語言的擴充
在上述C函數(shù)swap的聲明中,
形參是指針變量a、b。
主函數(shù)main的調(diào)用語句swap(&s,&t)將實參&s、
&t的值傳遞給了形參a、
b。
調(diào)用時,
系統(tǒng)為形參a、
b分配內(nèi)存空間,
并初始化為&s、
&t,
即s、
t的地址,
如圖9-1
(a)所示。
函數(shù)代碼執(zhí)行時,
對a、
b的操作即對實參s,t地址的操作,從而改變了變量s、t的值。上述C++函數(shù)swap的聲明中,形參a、b是整型變量的引用。主函數(shù)main的調(diào)用語句swap(s,t)發(fā)生時,
則由實參s、
t將變量名傳給形參a、
b,
即完成下列初始化形參的動作:int&a=s;int&b=t;如圖9-1
(b)所示,a為s的別名,b為t的別名,別名與變量本身都引用同一塊內(nèi)存空間。調(diào)用發(fā)生后,形參a,b的改變即實參s,t的改變。上一頁下一頁返回9.2C++語言對C語言的擴充
9.2.6
C++重載函數(shù)C++允許為在同一作用域中的某個函數(shù)指定多個定義,這稱為函數(shù)重載。在同一個作用域內(nèi),可以聲明幾個功能類似的同名函數(shù),但是這些同名函數(shù)的形參(指參數(shù)的個數(shù)、類型或者順序)必須不同。當(dāng)然,不能僅通過返回類型的不同來重載函數(shù)。當(dāng)調(diào)用一個重載函數(shù)時,編譯器通過把所使用的參數(shù)類型與定義中的參數(shù)類型進行比較,從而決定選用最合適的定義。下面的實例中,同名函數(shù)swap用于交換不同類型的數(shù)據(jù):上一頁下一頁返回9.2C++語言對C語言的擴充
上一頁下一頁返回9.2C++語言對C語言的擴充
上一頁下一頁返回9.2C++語言對C語言的擴充
當(dāng)上面的代碼被編譯和執(zhí)行時,會產(chǎn)生以下結(jié)果:上一頁下一頁返回9.2C++語言對C語言的擴充
9.2.7
C++函數(shù)模板在9.2.6節(jié)的舉例中,重載了三個swap函數(shù),分別實現(xiàn)了兩個int型變量、double型變量、char型變量的交換。要想實現(xiàn)其他類型數(shù)據(jù)的交換,就需要再次重載swap函數(shù)。而這些swap函數(shù)除了處理的數(shù)據(jù)類型不同外,在形式上都是一樣的。能否只寫一遍swap函數(shù),就能實現(xiàn)各種類型變量的交換呢?“模板”的概念就應(yīng)運而生了。程序設(shè)計語言中的模板用于批量生成功能和形式都幾乎相同的代碼。有了模板,編譯器就會在需要的時候,根據(jù)模板自動生成程序的代碼。從同一個模板自動生成的代碼,形式幾乎是一樣的。C++語言支持模板。有了模板,9.2.6節(jié)的示例可以只寫一個swap模板,編譯器在需要的時候會根據(jù)swap模板自動生成多種swap函數(shù),用以交換不同類型變量的值。上一頁下一頁返回9.2C++語言對C語言的擴充
函數(shù)模板的定義形式:template<class類型參數(shù)1,class類型參數(shù)2,>返回值類型模板名(形參表){函數(shù)體}其中,關(guān)鍵字class也可以用關(guān)鍵字typename替換。例如:template<typename類型參數(shù)1,typename類型參數(shù)2,>上一頁下一頁返回9.2C++語言對C語言的擴充
9.2.6節(jié)示例的swap模板可寫為如下:上一頁下一頁返回9.2C++語言對C語言的擴充
T是類型參數(shù),代表類型。編譯器在編譯到調(diào)用函數(shù)模板的語句時,會根據(jù)實參的類型來判斷該如何替換模板中的類型參數(shù)。例如,下面的程序執(zhí)行了不同的調(diào)用語句,編譯器根據(jù)swap函數(shù)模板自動生成不同的swap函數(shù)。上一頁下一頁返回9.2C++語言對C語言的擴充
9.2.8
C++動態(tài)內(nèi)存除了兼容C語言利用庫函數(shù)malloc和free分配和撤銷內(nèi)存空間外,C++還提供了簡單而功能強大的運算符new和delete來分配和撤銷內(nèi)存空間。C++使用運算符new來分配內(nèi)存。運算符new可以為一個簡單變量或一個數(shù)組分配內(nèi)存空間。創(chuàng)建一個簡單變量的內(nèi)存空間的語法格式:new類型名;這個操作在內(nèi)存中稱為向堆(heap)的區(qū)域申請一塊能存放相應(yīng)類型的數(shù)據(jù)空間,
并返回這塊空間的首地址。例如:int?p=newint;//申請一個存放整數(shù)的空間,返回一個指向整型數(shù)據(jù)的指針//申請一個存放浮點數(shù)的空間,初始化為20,返回一個指向浮點型數(shù)據(jù)的指針float?q=newfloat(20);上一頁下一頁返回9.2C++語言對C語言的擴充
用new操作也可以創(chuàng)建一個以為數(shù)組。語法格式:new類型名[元素個數(shù)]這個操作在內(nèi)存堆區(qū)域中申請一塊連續(xù)的空間,存放指定類型的一組元素,并返回這塊空間的首地址。例如:int?pa=newint[10]; //申請存放10個整型數(shù)據(jù)的內(nèi)存空間,p為這塊空間的首地址在C++程序運行期間,動態(tài)申請空間不會被撤銷,需要使用delete運算符顯式地使之消亡。若要回收一個動態(tài)內(nèi)存空間,可以用delete指針變量;若要回收一塊連續(xù)內(nèi)存空間(一維數(shù)組),可以用delete[]指針變量;上一頁下一頁返回9.2C++語言對C語言的擴充
下面的代碼演示了內(nèi)存的申請和回收:double?pvalue=NULL,?qvalue=NULL; //初始化為null的指針pvalue=newdouble; //為變量請求內(nèi)存qvalue=newdouble[20]; //為數(shù)組請求內(nèi)存deletepvalue; //釋放內(nèi)存delete[]qvalue; //釋放內(nèi)存上一頁下一頁返回9.2C++語言對C語言的擴充
使用new操作符可以為多維數(shù)組分配內(nèi)存。如下代碼為二維數(shù)組分配內(nèi)存:上一頁下一頁返回9.2C++語言對C語言的擴充
9.2.9
C++異常處理C++異常是指在程序運行時發(fā)生的特殊情況,如嘗試除以零的操作。為了保證程序的健壯性,需要對程序中可能出現(xiàn)的異常情況進行考慮,并給出相應(yīng)的處理。本節(jié)介紹C++對程序異常的簡單處理。C++異常處理涉及三個關(guān)鍵字:throw、catch、try。(1)throw:當(dāng)問題出現(xiàn)時,
程序會拋出一個異常。
該異常通過使用throw關(guān)鍵字來完成。(2)catch:catch關(guān)鍵字用于捕獲異常。
在想要處理問題的位置,
通過異常處理程序來捕獲異常。(3)try:try塊中放置可能拋出異常的代碼。
它后面通常跟著一個或多個catch塊。如果程序發(fā)生了異常,可以使用throw語句創(chuàng)建一個包含出錯信息的對象并拋出。上一頁下一頁返回9.2C++語言對C語言的擴充
異常拋出語句的一般形式:throw<操作數(shù)>throw的操作數(shù)可以是任何類型。本節(jié)介紹的操作數(shù)是一個結(jié)果為任何類型的表達式,表達式的結(jié)果類型決定了拋出的異常的類型。例如,若除數(shù)為零,則可以直接拋出一個不可變的字符串信息“Divisionbyzero!”,
異常的類型就為constchar?類型。
如果拋出一個整型0,異常的類型為整型。下面的函數(shù)包含了拋出異常的操作:doubledivision(inta,intb){if(b==0)throw"Divisionbyzero!";return((double)a/b);}上一頁下一頁返回9.2C++語言對C語言的擴充
一旦函數(shù)拋出了異常,調(diào)用該函數(shù)就能捕獲和處理這個異常。捕獲異常的方法是使用和catch語句塊。try塊中放置可能拋出異常的代碼,try塊中的代碼被稱為保護代碼。在C++中,
trycatch語句的語法格式:上一頁下一頁返回9.2C++語言對C語言的擴充
將上述代碼中division函數(shù)的異常捕獲并處理,main函數(shù)可以更改為如下:上一頁下一頁返回9.2C++語言對C語言的擴充
由于拋出了一個類型為constchar?的異常,
因此當(dāng)捕獲該異常時,
必須在catch塊中使用constchar?。
當(dāng)上面的代碼被編譯和執(zhí)行時,
會產(chǎn)生下列結(jié)果:Divisionbyzero!注意:cerr是標準錯誤流,和cin、cout一樣,也是iostream類的一個實例。cerr?qū)ο蟾綄俚綐藴叔e誤設(shè)備,通常也是顯示屏。上一頁返回9.3C++程序的編譯
如果想要設(shè)置C++語言環(huán)境,就需要確保計算機上有這樣兩款可用的軟件:文本編輯器和C++編譯器。很多程序員選擇集成開發(fā)環(huán)境,集編輯、編譯、鏈接、執(zhí)行、調(diào)試于一體。通過編輯器創(chuàng)建的文件通常稱為源文件,源文件包含程序源代碼。C++程序的源文件通常使用擴展名cpp?,F(xiàn)有的C語言編譯器也是C++編譯器。UNIX系統(tǒng)的CC編譯器、Linux系統(tǒng)的GCC編譯器、
Windows操作系統(tǒng)中的集成開發(fā)環(huán)境VisualC++和Code∷Blocks都可以編譯C++程序,
詳見13節(jié)。
本書的C++編程與討論也基于Code∷Blocks編譯系統(tǒng)。良好的編程習(xí)慣是將類定義、成員函數(shù)的實現(xiàn)、類的應(yīng)用分開。
一般把類定義編寫在頭文件h文件中,把類實現(xiàn)編寫在實現(xiàn)文件cpp中,把類的應(yīng)用編寫在另外的cpp文件中。因此,面向?qū)ο蟮木幊绦枰诰幾g環(huán)境中建立一個工程文件,將所有創(chuàng)建的文件放入工程,便于編輯與管理。返回9.4實訓(xùn)與實訓(xùn)指導(dǎo)
實訓(xùn)1
旋轉(zhuǎn)魔方陣輸入一個自然數(shù)n(n∈[2,15]),
要求采用動態(tài)申請二維數(shù)組空間的方式,
輸出如下的魔方陣,即n×n矩陣,元素取值為1~n×n,1在左上角,沿順時針方向依次放置各元素。n=3時,旋轉(zhuǎn)魔方陣如下:1
2
38
9
47
6
5n=4時,旋轉(zhuǎn)魔方陣如下:
1
2
3
412
13
14
511
16
15
610
9
8
7下一頁返回9.4實訓(xùn)與實訓(xùn)指導(dǎo)
編寫程序,輸出符合要求的方陣,每個數(shù)字占5個字符寬度,向右對齊,在每一行末均輸出一個回車符。1實訓(xùn)分析按題目要求,輸出一個動態(tài)方陣,包含n2個方陣數(shù)據(jù),取值范圍為1~n2。但是,這n2個數(shù)據(jù)是旋轉(zhuǎn)出現(xiàn)在方陣中。以4階旋轉(zhuǎn)魔方陣為例,其旋轉(zhuǎn)的方向如圖9-2所示。對于偶數(shù)階旋轉(zhuǎn)魔方陣,共旋轉(zhuǎn)n/2圈;對于奇數(shù)階旋轉(zhuǎn)魔方陣,共旋轉(zhuǎn)(n-1)/2圈,還需要加上放在中間的最后一個數(shù)據(jù),例如,在3階矩陣中,將9放入方陣的最中間位置。程序的外層循環(huán)可以選擇旋轉(zhuǎn)的圈數(shù),也可以選擇填入的數(shù)據(jù)個數(shù)。無論哪種控制循環(huán)的方式,都要使數(shù)據(jù)旋轉(zhuǎn)填入。旋轉(zhuǎn)的順序為先向右,再向下,然后向左,最后向上。上一頁下一頁返回9.4實訓(xùn)與實訓(xùn)指導(dǎo)
為了程序書寫的方便,
將每個旋轉(zhuǎn)方向填入的數(shù)據(jù)設(shè)置為相同個數(shù),
如在4階旋轉(zhuǎn)方陣中,第1次旋轉(zhuǎn)的四個方向填入的數(shù)據(jù)個數(shù)都為3,共填入3×4=12個數(shù)據(jù)。設(shè)置每次旋轉(zhuǎn)的起點下標為(x,y),
第一次旋轉(zhuǎn)的起點下標為(0,0),
第2次旋轉(zhuǎn)的起點為(1,1),
依次遞增。上一頁下一頁返回9.4實訓(xùn)與實訓(xùn)指導(dǎo)
根據(jù)上述分析,算法的偽代碼如下:(1)輸入方陣的階數(shù)n;(2)生成旋轉(zhuǎn)魔方陣到二維數(shù)組a:(2.1)將填入的數(shù)據(jù)k初始化1,
旋轉(zhuǎn)起點(x,y)初始化為(0,0);(2.2)while(k<=n?n):(2.2.1)行標i=x,
列標j=y;(2.2.2)向右旋轉(zhuǎn),
行標i為x,
列標j取值為y~(n-y-2),
填入數(shù)據(jù)k++;(2.2.3)向下旋轉(zhuǎn),
列標j為n-y-1,
行標i取值為x~(n-x-2),
填入數(shù)據(jù)k++;上一頁下一頁返回9.4實訓(xùn)與實訓(xùn)指導(dǎo)
(2.2.4)向左旋轉(zhuǎn),
行標i為n-x-1,
列標j取值為(n-y-1)~(y+1),填入數(shù)據(jù)k++;(2.2.5)向上旋轉(zhuǎn),
列標為y,
行取值為(n-x-1)~(x+1),
填入數(shù)據(jù)k++;(2.2.6)改變旋轉(zhuǎn)起點,
x++,
y++;(2.2.7)如果下次旋轉(zhuǎn)的數(shù)據(jù)只有一個時,
直接填入數(shù)據(jù)k++;上一頁下一頁返回9.4實訓(xùn)與實訓(xùn)指導(dǎo)
(3)按要求輸出數(shù)據(jù)。程序的代碼如下:上一頁下一頁返回9.4實訓(xùn)與實訓(xùn)指導(dǎo)
上一頁下一頁返回9.4實訓(xùn)與實訓(xùn)指導(dǎo)
上一頁下一頁返回9.4實訓(xùn)與實訓(xùn)指導(dǎo)
上一頁下一頁返回9.4實訓(xùn)與實訓(xùn)指導(dǎo)
2實訓(xùn)練習(xí)給定一個起始數(shù)(大于等于1,
小于等于20)和方陣的階數(shù)(大于等于1,
小于等于20),
編程求得并輸出該折疊方陣。
一個起始數(shù)為10的4階折疊方陣如下:10
11
14
1913
12
15
2018
17
16
2125
24
23
22從標準輸入中輸入兩個正整數(shù),分別表示起始數(shù)和方陣的階數(shù),以一個空格來分隔這兩個數(shù)字。將生成的折疊方陣按行輸出到標準輸出上,每個數(shù)字占4個字符的寬度,靠右對齊,各數(shù)字之間不再有空格分隔,每行末尾有回車換行。上一頁下一頁返回9.4實訓(xùn)與實訓(xùn)指導(dǎo)
實訓(xùn)2
刪除重復(fù)字符編寫一個程序,
從鍵盤接收一個字符串,
然后按照字符順序從小到大進行排序,
并刪除重復(fù)的字符。
要求程序可以處理含有空格的字符串。
例如,
輸入字符串“badacgegfacb”,
輸出字符串“abcdefg”。1實訓(xùn)分析在C++中,可以采用類型string表示字符串,并可以調(diào)用相關(guān)函數(shù)來完成字符串的操作。程序需要處理包含空格的字符串,所以可以采用C++的庫函數(shù)getline函數(shù)來獲取字符串。
字符串的排序可以調(diào)用C++標準庫里的排序函數(shù)sort函數(shù)實現(xiàn)時間復(fù)雜度為nlog2
(n)的排序。上一頁下一頁返回9.4實訓(xùn)與實訓(xùn)指導(dǎo)
C++標準模板庫(STL)里的排序函數(shù)的使用方法如下:(1)sort函數(shù)包含在頭文件為#include<algorithm>的C++標準庫,它使用的排序方法的時間復(fù)雜度為n×log2
(n)。(2)sort函數(shù)使用的模板如下:sort(start,end,排序方法)參數(shù)說明:start:要排序的數(shù)組的起始地址。end:結(jié)束的地址(最后一位要排序的地址)。排序方法:排序的方法,可以是從大到小也可是從小到大,還可以缺省這個參數(shù),此時默認的排序方法是從小到大排序。上一頁下一頁返回9.4實訓(xùn)與實訓(xùn)指導(dǎo)
綜上所述,算法的偽代碼如下:(1)接收字符串str,
并獲取字符串長度len;(2)調(diào)用C++標準庫里的sort函數(shù)排序字符串;(3)遍歷字符串,
刪除重復(fù)字符:(3.1)初始化循環(huán)變量i=0,;(3.2)判斷str[i]和str[i+1]是否相等。
如果不相等,
則i++;
如果相等,
則將后續(xù)字符逐個往前移動:(3.2.1)初始化循環(huán)變量j=i,
執(zhí)行str[j]=str[j+1],
將后續(xù)字符前移;(3.2.2)如果j<n-1,
就重復(fù)執(zhí)行(3.2.1);(3.2.3)將字符串長度len--;(3.3)如果i<n-1,
就重復(fù)執(zhí)行(3.2);上一頁下一頁返回9.4實訓(xùn)與實訓(xùn)指導(dǎo)
(4)輸出字符串。上述算法可以調(diào)用缺省第3個參數(shù)的sort函數(shù),默認的排序方法是從小到大排序。程序的代碼如下:上一頁下一頁返回9.4實訓(xùn)與實訓(xùn)指導(dǎo)
上一頁下一頁返回9.4實訓(xùn)與實訓(xùn)指導(dǎo)
上一頁下一頁返回9.4實訓(xùn)與實訓(xùn)指導(dǎo)
如果需要將算法中的字符串按照從大到小的順序輸出,那么,在調(diào)用sort函數(shù)時,需要加入第三個參數(shù)。編寫一個比較函數(shù)comp,設(shè)計排序的方法。將字符串按照從大到小的順序進行排序的代碼如下:上一頁下一頁返回9.4實訓(xùn)與實訓(xùn)指導(dǎo)
上一頁下一頁返回9.4實訓(xùn)與實訓(xùn)指導(dǎo)
上一頁下一頁返回9.4實訓(xùn)與實訓(xùn)指導(dǎo)
2實訓(xùn)練習(xí)從鍵盤依次輸入某班學(xué)生的姓名和成績(一個班級的人數(shù)最多不超過50人),然后分別按學(xué)生成績由高到低的順序輸出學(xué)生的姓名和成績,若成績相同,則按輸入次序排序。上一頁下一頁返回9.4實訓(xùn)與實訓(xùn)指導(dǎo)
實訓(xùn)3
字符串全排列給定一個由不同的小寫字母組成的字符串,輸出這個字符串的所有全排列。假設(shè)對于小寫字母有'a'<'b’<···<'y'<'z',而且給定的字符串中的字母已經(jīng)按照從小到大的順序排列。要求輸入只有一行,
是一個由不同的小寫字母組成的字符串,
已知字符串的長度為1~6。
輸出這個字符串的所有排列方式,
每行一個排列。
要求:將字母序比較小的排列在前面。上一頁下一頁返回9.4實訓(xùn)與實訓(xùn)指導(dǎo)
字母序如下定義:已知S=s1s2
···sk,
T=t1t2
···tk,
則S<T等價于,
存在p(1≤p≤k),
使s1=
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 執(zhí)業(yè)獸醫(yī)考試考試題預(yù)防科目及答案
- 煙花爆竹考試題及答案
- 監(jiān)護人防溺水測試題附答案
- 幼兒教育題庫論述題及答案
- 二建網(wǎng)絡(luò)考試題及答案
- 新安全生產(chǎn)法試題庫及參考答案
- 中藥試題+答案
- 重癥醫(yī)學(xué)科考試試題與答案
- 陜西省延安市輔警公共基礎(chǔ)知識題庫(附答案)
- 客服營銷面試試題及答案
- 2026中國電信四川公用信息產(chǎn)業(yè)有限責(zé)任公司社會成熟人才招聘備考題庫及參考答案詳解1套
- 2025年廣東省生態(tài)環(huán)境廳下屬事業(yè)單位考試真題附答案
- 2026年安徽省公務(wù)員考試招錄7195名備考題庫完整參考答案詳解
- 【地理】期末模擬測試卷-2025-2026學(xué)年七年級地理上學(xué)期(人教版2024)
- LoRa技術(shù)教學(xué)課件
- GB/T 1957-2006光滑極限量規(guī)技術(shù)條件
- GB 28480-2012飾品有害元素限量的規(guī)定
- 劉一秒演說智慧經(jīng)典(內(nèi)部筆記)
- 管道TOFD檢測記錄及續(xù)表
- 馬克思主義哲學(xué)精講課件
- 期末考試總安排
評論
0/150
提交評論