C語言學習筆記與開發(fā)技巧與典型列子_第1頁
C語言學習筆記與開發(fā)技巧與典型列子_第2頁
C語言學習筆記與開發(fā)技巧與典型列子_第3頁
C語言學習筆記與開發(fā)技巧與典型列子_第4頁
C語言學習筆記與開發(fā)技巧與典型列子_第5頁
已閱讀5頁,還剩29頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

Visual

C++開發(fā)工具與調(diào)試技巧整理

1、如何在Release狀態(tài)下進行調(diào)試

Project->Setting=>ProjectSetting對話框,選擇Release狀態(tài)。C/C++標簽中的Category選General,Optimizations選Disable(Debug),Debut

info選Program

Database。在Link標簽中選中Generate

debug

info復選框。

注:只是一個介乎Debug和Release的中間狀態(tài),所有的ASSERT、VERIFY都不起作用,函數(shù)調(diào)用方式已經(jīng)是真正的調(diào)用,而不查表,但是這種狀態(tài)下QuickWatch、調(diào)用隊列跟蹤功能仍然有效,和Debug版一樣。

2、Release和Debug有什么不同

Release版稱為發(fā)行版,Debug版稱為調(diào)試版。

Debug中可以單步執(zhí)行、跟蹤等功能,但生成的可執(zhí)行文件比較大,代碼運行速度較慢。Release版運行速度較快,可執(zhí)行文件較小,但在其編譯條件下無法執(zhí)行調(diào)試功能。

Release的exe文件鏈接的是標準的MFC

DLL(Use

MFC

in

a

shared

or

static

dll)。這些DLL在安裝Windows的時候,已經(jīng)配置,所以這些程序能夠在沒有安裝Visual

C++

6.0的機器上運行。而Debug版本的exe鏈接了調(diào)試版本的MFC

DLL文件,在沒有安裝Visual

C++6.0的機器上不能運行,因為缺相應的DLL,除非選擇use

static

dll

when

link。

(北大青鳥煙臺文化宮中心

-

)

3、ASSERT和VERIFY有什么區(qū)別

ASSERT里面的內(nèi)容在Release版本中不編譯,VERIFY里面的內(nèi)容仍然翻譯,但不再判斷真假。所以后者更安全一點。例如ASSERT(file.Open(strFileName))。

一旦到了Release版本中,這一行就忽略了,file根本就不Open()了,而且沒有任何出錯的信息。如果用VERIFY()就不會有這個問題。

4、Workspace和Project之間是什么樣的關(guān)系

每個Workspace可以包括幾個project,但只有一個處于Active狀態(tài),各個project之間可以有依賴關(guān)系,在project的Setting..中可以設定,比如那個Active狀態(tài)的project可以依賴于其他的提供其函數(shù)調(diào)用的靜態(tài)庫。

5、如何在非MFC程序中使用ClassWizard

在工程目錄下新建一個空的.RC文件,然后加入到工程中就可以了。

6、如何設置斷點

按F9在當前光標處增加一個斷點和取消一個斷點。

另外,在編輯狀態(tài)下,按Ctrl+B組合鍵,彈出斷點設置對話框。然后單擊【Condition…】按鈕彈出設置斷點條件的對話框進行設置。

7、在編輯狀態(tài)下發(fā)現(xiàn)成員變量或函數(shù)不能顯示提示是如何打開顯示功能

這似乎是目前這個Visual

C++

6.0版本的一個bug,可按如下步驟使其正常,如再出現(xiàn),可如法炮制:

(1)關(guān)閉Project

(2)刪除“工程名.ncb”文件

(3)重新打開工程

8、如何將一個通過ClassWizard生成的類徹底刪除

首先在工作區(qū)的FileView中選中該類的.h和.cpp文件,按delete刪除,然后在文件管理器中將這兩個文件刪除,再運行ClassWizard,這時出現(xiàn)是否移走該類的提示,選擇remove就可以了。

9、如何將在workspace中消失的類找出來

打開該類對應的頭文件,然后將其類名隨便改一下,這個時候工作區(qū)就會出現(xiàn)新的類,再將這個類改回原來的名字就可以了。

10、如何清除所有的斷點

菜單【Edit】->【Breakpoints…】,打開“Breakpoints”對話框,單擊【Remove

All】按鈕即可??旖萱I是“Ctrl

+

Shift

+

F8”。

11、如何再ClassWizard中選擇未列出的信息

打開“ClassWizard”對話框,然后切換到“Class

Info”頁面。改變“Message

filter”,如選擇“Window”,“Message”頁面就會出現(xiàn)Window的信息。

12、如何檢測程序中的括號是否匹配

把光標移動到需要檢測的括號前面,按快捷鍵“Ctrl

+

]”。如果括號匹配正確,光標就跳到匹配的括號處,否則光標不移動,并且機箱喇叭還會發(fā)出一聲警告。

13、如何查看一個宏(或變量、函數(shù))的定義

把光標移動到要查看的一個宏上,就比如說最常見的DECLARE_MAP_MESSAGE上按一下F12(或右鍵菜單中的相關(guān)菜單),如果沒有建立瀏覽文件,就會出現(xiàn)提示對話框,按【確定】按鈕,然后就會跳到該宏(或變量、函數(shù))定義的地方。

14、如何添加Lib文件到當前工程

單擊菜單【Project】->【Settings…】彈出“Project

Setting”對話框,切換到“Link”標簽頁,在“Object/library

modules”處輸入Lib文件名稱,不同的Lib之間用空格格開。

15、如何快速刪除項目下的Debug文件夾中臨時文件

在工作區(qū)的FileView視圖中選中對應的項目,單擊右鍵彈出菜單,選擇【Clean(selection

only)】菜單即可。

16、如何快速生成一個現(xiàn)有工程除了工程名外完全相同的新工程

在新建工程的“New”對話框中選擇“Custom

Appwizard”項,輸入新工程的名字,單擊【OK】按鈕。出現(xiàn)“Custom

AppWizard”項,輸入新工程的名字,單擊【OK】按鈕。出現(xiàn)“Custom

AppWizard-Step

1

of

2”對話框,選擇“An

existing

Project”項,單擊【Next】按鈕。出現(xiàn)“Custom

AppWizard-Step

2

of

2”對話框,選擇現(xiàn)有工程的工程文件名,最后單擊【Finish】按鈕。編譯后就生成一個與現(xiàn)有工程相同但可以重新取名的工程AppWizard。

現(xiàn)在就可以項用MFC

AppWizard一樣用這個定制的向?qū)АH绻幌胗昧?,可以在Visual

C++

6.0安裝目錄下Common\MSDev98\Template目錄中刪除該Wizard對應的.awx和.pdb文件。

17、如何解決Visual

C++

6.0不正確連接的問題

情景:明明改動了一個文件,卻要把整個項目全部重新編譯鏈接一次。剛剛鏈接好,一運行,又提示重新編譯鏈接一次。

這是因為出現(xiàn)了未來文件(修改時間和創(chuàng)建時間比系統(tǒng)時間晚)的緣故。可以這樣處理:找到工程文件夾下的debug目錄,將創(chuàng)建和修改時間都比系統(tǒng)時間的文件全部刪除,然后再從新“Rebuild

All”一次。

18、引起LNK2001的常見錯誤都有哪些

遇到的LNK2001錯誤主要為:unresolved

external

symbol

“symbol”。

如果鏈接程序不能在所有的庫和目標文件內(nèi)找到所引用的函數(shù)、變量或標簽,將產(chǎn)生此錯誤信息。

一般來說,發(fā)生錯誤的原因有兩個:一是所引用的函數(shù)、變量不存在,拼寫不正確或者使用錯誤;其次可能使用了不同版本的鏈接庫。以下是可能產(chǎn)生LNK2001錯誤的原因:

<1>由于編碼錯誤導致的LNK2001錯誤

(1)不相匹配的程序代碼或模塊定義(.DEF)文件導致LNK2001。例如,如果在C++源文件了內(nèi)聲明了一變量“var1”,卻試圖在另一個文件內(nèi)以變量“var1”訪問改變量。

(2)如果使用的內(nèi)聯(lián)函數(shù)是在.cpp文件內(nèi)定義的,而不是在頭文件內(nèi)定義將導致LNK2001錯誤。

(3)調(diào)用函數(shù)時如果所用的參數(shù)類型和頭函數(shù)聲明時的類型不符將會產(chǎn)生LNK2001錯誤。

(4)試圖從基類的構(gòu)造函數(shù)或析構(gòu)函數(shù)中調(diào)用虛擬函數(shù)時將會導致LNK2001錯誤。

(5)要注意函數(shù)和變量的可公用性,只有全局變量、函數(shù)是可公用的。靜態(tài)函數(shù)和靜態(tài)變量具有相同的使用范圍限制。當試圖從文件外部方位任何沒有在該文件內(nèi)聲明的靜態(tài)變量時將導致編譯錯誤或LNK2001錯誤。

<2>由于編譯和聯(lián)機的設置而造成的LNK2001錯誤

(1)如果編譯時使用的是/NOD(/NODERAULTLIB)選項,程序所需要的運行庫和MFC時將得到又編譯器寫入目標文件模塊,但除非在文件中明確包含這些庫名,否則這些庫不會被鏈接進工程文件。這種情況下使用/NOD將導致LNK2001錯誤。

2)如果沒有為wWinMainCRTStartup設定程序入口,在使用Unicode和MFC時將出現(xiàn)“unresolved

external

on

_WinMain@16”的LNK2001錯誤信息。

(3)使用/MD選項編譯時,既然所有的運行庫都被保留在動態(tài)鏈接庫之內(nèi),源文件中對“func”的引用,在目標文件里即對“__imp__func”的引用。如果試圖使用靜態(tài)庫LIBC.LIB或LIBCMT.LIB進行鏈接,將在__imp__func上發(fā)生LNK2001錯誤。如果不使用/MD選項編譯,在使用MSVCxx.LIB鏈接時也會發(fā)生LNK2001錯誤。

(4)使用/ML選項編譯時,如用LIBCMT.LIB鏈接會在_errno上發(fā)生LNK2001錯誤。

(5)當編譯調(diào)試版的應用程序時,如果采用發(fā)行版模態(tài)庫進行鏈接也會產(chǎn)生LNK2001錯誤;同樣,使用調(diào)試版模態(tài)庫鏈接發(fā)行版應用程序時也會產(chǎn)生相同的錯誤。

(6)不同版本的庫和編譯器的混合使用也能產(chǎn)生問題,因為新版的庫里可能包含早先的版本沒有的符號和說明。

(7)在不同的模塊中使用內(nèi)聯(lián)和非內(nèi)聯(lián)的編譯選項能夠?qū)е翷NK2001錯誤。如果創(chuàng)建C++庫時打開了函數(shù)內(nèi)聯(lián)(/Ob1或/Ob2),但是在描述該函數(shù)的相應頭文件里卻關(guān)閉了函數(shù)內(nèi)聯(lián)(沒有inline關(guān)鍵字),只是將得到錯誤信息。為避免該問題的發(fā)生,應該在相應的頭文件中用inline關(guān)鍵字標志為內(nèi)聯(lián)函數(shù)。

(8)不正確的/SUBSYSTEM或ENTRY設置也能導致LNK2001錯誤。

19、如何調(diào)試一個沒有源碼的exe文件調(diào)用的dll

在Visual

C++

6.0中,進入“Project

Setting”對話框然后選擇Debug標簽頁。通常Visual

Studio默認“executable

for

debug

session”為可執(zhí)行文件名,但可以將他改成任何你想要的程序。甚至可以指定不同的工作目錄以及傳遞參數(shù)到你的程序。這個技術(shù)常用來調(diào)試Dlls、名字空間擴展、COM對象和其他從某些EXE以及從第三方的EXE中調(diào)用的plug-in程序。

20、Visual

C++

6.0工程中的項目文件都表示什么

.opt:工程關(guān)于開發(fā)環(huán)境的參數(shù)文件。如工具條位置等信息。

.aps(AppStudio

File)資源輔助文件,二進制格式,一般不用去管它。

.clw:ClassWizard信息文件,實際上是INI文件格式,有興趣可以研究一下。有時候ClassWizard出了問題,手工修改CLW文件可以解決。如果此文件不存在的話,每次用ClassWizard的時候回提示是否重建。

.dsp(DevelopStudio

Project):項目文件,文本格式,不過不熟悉的不要手工修改。

.dsw(DevelopStudio

Workspace):是工作區(qū)文件,其他特點和.dsp差不多。

.plg:是編譯信息文件,編譯時的error和warning信息文件(實際上是一個html文件),一般用處不大。在單擊菜單【Tool】->【Option】彈出的對話框里面有個選項可以控制這個文件的生成。

.hpj(Help

Project):是生成幫助文件的工程,用microsoft

Help

Compiler可以處理。

.mdp(Microsoft

DevStudio

Project):是舊版本的項目文件,如果要打開此文件的話,會提示你是否轉(zhuǎn)換成新的.dsp格式。

.bsc:是用于瀏覽項目信息的,如果用Source

Brower的話就必須有這個文件。如果不用這個功能的話,可以在Project

Options里面去掉Generate

Browse

Info

File,這樣可以加快編譯速度。

.map是執(zhí)行文件的映象信息記錄文件,除非對系統(tǒng)底層,這個文件一般用不著。

.pch(Pre-Compiled

File):是與編譯文件,可以加快編譯速度,但是文件非常大。

.pdb(Program

Database):記錄了程序有關(guān)的一些數(shù)據(jù)和調(diào)試信息,在調(diào)試的時候可能有用。

.exp:只有在編譯DLL的時候才會生成,記錄了DLL文件的一些信息,一般也沒有用。

.ncb:無編譯瀏覽文件(no

compile

browser)。當自動完成功能出問題時可以刪除此文件。編譯工程后會自動生成。1.4利用MFC進行開發(fā)的通用方法介紹

以下是我在最初學習VC時所常用的開發(fā)思路和方法,希望能對初學VC的朋友有所幫助和啟發(fā)。1、開發(fā)需要讀寫文件的應用程序并且有簡單的輸入和輸出可以利用單文檔視結(jié)構(gòu)。2、開發(fā)注重交互的簡單應用程序可以使用對話框為基礎的窗口,如果文件讀寫簡單這可利用CFile進行。3、開發(fā)注重交互并且文件讀寫復雜的的簡單應用程序可以利用以CFormView為基礎視的單文檔視結(jié)構(gòu)。4、利用對話框得到用戶輸入的數(shù)據(jù),在等級提高后可使用就地輸入。5、在對多文檔要求不強烈時盡量避免多文檔視結(jié)構(gòu),可以利用分隔條產(chǎn)生單文檔多視結(jié)構(gòu)。6、在要求在多個文檔間傳遞數(shù)據(jù)時使用多文檔視結(jié)構(gòu)。7、學會利用子窗口,并在自定義的子窗口包含多個控件達到封裝功能的目的。8、盡量避免使用多文檔多視結(jié)構(gòu)。9、不要使用多重繼承并盡量減少一個類中封裝過多的功能。1.5MFC中常用類,宏,函數(shù)介紹

常用類CRect:用來表示矩形的類,擁有四個成員變量:topleftbottomright。分別表是左上角和右下角的坐標。可以通過以下的方法構(gòu)造:CRect(intl,intt,intr,intb);指明四個坐標CRect(constRECT&srcRect);由RECT結(jié)構(gòu)構(gòu)造CRect(LPCRECTlpSrcRect);由RECT結(jié)構(gòu)構(gòu)造CRect(POINTpoint,SIZEsize);有左上角坐標和尺寸構(gòu)造CRect(POINTtopLeft,POINTbottomRight);有兩點坐標構(gòu)造下面介紹幾個成員函數(shù):intWidth()const;得到寬度

intHeight()const;得到高度

CSizeSize()const;得到尺寸

CPoint&TopLeft();得到左上角坐標

CPoint&BottomRight();得到右下角坐標

CPointCenterPoint()const;得當中心坐標

此外矩形可以和點(CPoint)相加進行位移,和另一個矩形相加得到“并”操作后的矩形。CPoint:用來表示一個點的坐標,有兩個成員變量:xy。可以和另一個點相加。CString:用來表示可變長度的字符串。使用CString可不指明內(nèi)存大小,CString會根據(jù)需要自行分配。下面介紹幾個成員函數(shù):GetLength得到字符串長度

GetAt得到指定位置處的字符

operator+相當于strcat

voidFormat(LPCTSTRlpszFormat,...);相當于sprintf

Find查找指定字符,字符串

Compare比較

CompareNoCase不區(qū)分大小寫比較

MakeUpper改為小寫

MakeLower改為大寫CStringArray:用來表示可變長度的字符串數(shù)組。數(shù)組中每一個元素為CString對象的實例。下面介紹幾個成員函數(shù):Add增加CString

RemoveAt刪除指定位置CString對象

RemoveAll刪除數(shù)組中所有CString對象

GetAt得到指定位置的CString對象

SetAt修改指定位置的CString對象

InsertAt在某一位置插入CString對象常用宏RGBTRACEASSERTVERIFY

常用函數(shù)CWindApp*AfxGetApp();HINSTANCEAfxGetInstanceHandle();HINSTANCEAfxGetResourceHandle();intAfxMessageBox(LPCTSTRlpszText,UINTnType=MB_OK,UINTnIDHelp=0);用于彈出一個消息框C/C++——小編談C語言函數(shù)那些事(53)C程序是由一組或是變量或是函數(shù)的外部對象組成的。函數(shù)是一個自我包含的完成一定相關(guān)功能的執(zhí)行代碼段。下面小編和大家分享下C語言中的函數(shù)。1.div函數(shù)div函數(shù)的功能是將兩個整數(shù)相除,返回商和余數(shù),其用法為:div_t(intnumber,intdenom);程序?qū)嵗缦拢?include<stdlib.h>#include<stdio.h>div_tx;intmain(void){x=div(10,3);printf("10div3=%dremainder%d\n",x.quot,x.rem);return0;}2.dup函數(shù)dup函數(shù)的功能是復制一個文件句柄,其用法為intdup(inthandle);程序?qū)嵗a如下:#include<string.h>#include<stdio.h>#include<conio.h>#include<io.h>voidflush(FILE*stream);intmain(void){FILE*fp;charmsg[]="Thisisatest";fp=fopen("DUMMY.FIL","w");fwrite(msg,strlen(msg),1,fp);clrscr();printf("Pressanykeytoflush\DUMMY.FIL:");getch();flush(fp);printf("\nFilewasflushed,Pressany\keytoquit:");getch();return0;}voidflush(FILE*stream){intduphandle;fflush(stream);duphandle=dup(fileno(stream));DOSbuffer*/close(duphandle);}

3.atan2函數(shù)atan2函數(shù)的功能是計算Y/X的反正切值,其用法為doubleatan2(doubley,doublex);程序?qū)嵗a如下:#include<stdio.h>#include<math.h>intmain(void){doubleresult;doublex=90.0,y=45.0;result=atan2(y,x);printf("Thearctangentratioof%lfis%lf\n",(y/x),result);return0;}

4.gety函數(shù)gety函數(shù)的功能是返回當前圖形位置的y坐標,其用法為:intfargety(void);程序?qū)嵗a如下:#include<graphics.h>#include<stdlib.h>#include<stdio.h>#include<conio.h>intmain(void){intgdriver=DETECT,gmode,errorcode;charmsg[80];initgraph(&gdriver,&gmode,"");errorcode=graphresult();if(errorcode!=grOk){printf("Graphicserror:%s\n",grapherrormsg(errorcode));printf("Pressanykeytohalt:");getch();exit(1);}moveto(getmaxx()/2,getmaxy()/2);sprintf(msg,"<-(%d,%d)isthehere.",getx(),gety());outtext(msg);getch();closegraph();return0;}2.1和GUI有關(guān)的各種對象在Windows中有各種GUI對象(不要和C++對象混淆),當你在進行繪圖就需要利用這些對象。而各種對象都擁有各種屬性,下面分別講述各種GUI對象和擁有的屬性。字體對象CFont用于輸出文字時選用不同風格和大小的字體??蛇x擇的風格包括:是否為斜體,是否為粗體,字體名稱,是否有下劃線等。顏色和背景色不屬于字體的屬性。關(guān)于如何創(chuàng)建和使用字體在2.2在窗口中輸出文字中會詳細講解。刷子CBrush對象決定填充區(qū)域時所采用的顏色或模板。對于一個固定色的刷子來講它的屬性為顏色,是否采用網(wǎng)格和網(wǎng)格的類型如水平的,垂直的,交叉的等。你也可以利用8*8的位圖來創(chuàng)建一個自定義模板的刷子,在使用這種刷子填充時系統(tǒng)會利用位圖逐步填充區(qū)域。關(guān)于如何創(chuàng)建和使用刷子在2.3使用刷子,筆進行繪圖中會詳細講解。畫筆CPen對象在畫點和畫線時有用。它的屬性包括顏色,寬度,線的風格,如虛線,實線,點劃線等。關(guān)于如何創(chuàng)建和使用畫筆在2.3使用刷子,筆進行繪圖中會詳細講解。位圖CBitmap對象可以包含一幅圖像,可以保存在資源中。關(guān)于如何使用位圖在2.4在窗口中繪制設備相關(guān)位圖,圖標,設備無關(guān)位圖中會詳細講解。還有一種特殊的GUI對象是多邊形,利用多邊形可以很好的限制作圖區(qū)域或是改變窗口外型。關(guān)于如何創(chuàng)建和使用多邊形在2.6多邊形和剪貼區(qū)域中會詳細講解。在Windows中使用GUI對象必須遵守一定的規(guī)則。首先需要創(chuàng)建一個合法的對象,不同的對象創(chuàng)建方法不同。然后需要將該GUI對象選入DC中,同時保存DC中原來的GUI對象。如果選入一個非法的對象將會引起異常。在使用完后應該恢復原來的對象,這一點特別重要,如果保存一個臨時對象在DC中,而在臨時對象被銷毀后可能引起異常。有一點必須注意,每一個對象在重新創(chuàng)建前必須銷毀,下面的代碼演示了這一種安全的使用方法:OnDraw(CDC*pDC){ CPenpen1,pen2; pen1.CreatePen(PS_SOLID,2,RGB(128,128,128));//創(chuàng)建對象 pen2.CreatePen(PS_SOLID,2,RGB(128,128,0));//創(chuàng)建對象 CPen*pPenOld=(CPen*)pDC->SelectObject(&pen1);//選擇對象進DC drawWithPen1... (CPen*)pDC->SelectObject(&pen2);//選擇對象進DC drawWithPen2... pen1.DeleteObject();//再次創(chuàng)建前先銷毀 pen1.CreatePen(PS_SOLID,2,RGB(0,0,0));//再次創(chuàng)建對象 (CPen*)pDC->SelectObject(&pen1);//選擇對象進DC drawWithPen1... pDC->SelectObject(pOldPen);//恢復}此外系統(tǒng)中還擁有一些庫存GUI對象,你可以利用CDC::SelectStockObject(SelectStockObject(intnIndex)選入這些對象,它們包括一些固定顏色的刷子,畫筆和一些基本字體。BLACK_BRUSH

Blackbrush.DKGRAY_BRUSH

Darkgraybrush.GRAY_BRUSH

Graybrush.HOLLOW_BRUSH

Hollowbrush.LTGRAY_BRUSH

Lightgraybrush.NULL_BRUSH

Nullbrush.WHITE_BRUSH

Whitebrush.BLACK_PEN

Blackpen.NULL_PEN

Nullpen.WHITE_PEN

Whitepen.ANSI_FIXED_FONT

ANSIfixedsystemfont.ANSI_VAR_FONT

ANSIvariablesystemfont.DEVICE_DEFAULT_FONT

Device-dependentfont.OEM_FIXED_FONT

OEM-dependentfixedfont.SYSTEM_FONT

Thesystemfont.Bydefault,Windowsusesthesystemfonttodrawmenus,dialog-boxcontrols,andothertext.InWindowsversions3.0andlater,thesystemfontisproportionalwidth;earlierversionsofWindowsuseafixed-widthsystemfont.SYSTEM_FIXED_FONT

Thefixed-widthsystemfontusedinWindowspriortoversion3.0.ThisobjectisavailableforcompatibilitywithearlierversionsofWindows.DEFAULT_PALETTE

Defaultcolorpalette.Thispaletteconsistsofthe20staticcolorsinthesystempalette.這些對象留在DC中是安全的,所以你可以利用選入庫存對象來作為恢復DC中GUI對象。大家可能都注意到了繪圖時都需要一個DC對象,DC(DeviceContext設備環(huán)境)對象是一個抽象的作圖環(huán)境,可能是對應屏幕,也可能是對應打印機或其它。這個環(huán)境是設備無關(guān)的,所以你在對不同的設備輸出時只需要使用不同的設備環(huán)境就行了,而作圖方式可以完全不變。這也就是Windows耀眼的一點設備無關(guān)性。如同你將對一幅畫使用照相機或復印機將會產(chǎn)生不同的輸出,而不需要對畫進行任何調(diào)整。DC的使用會穿插在本章中進行介紹。c++繼承經(jīng)典例子#include<iostream.h>classBase{private:intb_number;public:Base(){}Base(inti):b_number(i){}intget_number(){returnb_number;}voidprint(){cout<<b_number<<endl;}};classDerived:publicBase{private:intd_number;public://constructor,initializerusedtoinitializethebasepartofaDerivedobject.Derived(inti,intj):Base(i),d_number(j){};//anewmemberfunctionthatoverridestheprint()functioninBasevoidprint(){cout<<get_number()<<"";//accessnumberthroughget_number()cout<<d_number<<endl;}};intmain(){Basea(2);Derivedb(3,4);cout<<"ais";a.print();//print()inBasecout<<"bis";b.print();//print()inDerivedcout<<"basepartofbis";b.Base::print();//print()inBasereturn0;}--------------------------------------------------------------------------------沒有虛析構(gòu)函數(shù),繼承類沒有析構(gòu)//Example:non-virtualdestructorsfordynamicallyallocatedobjects.#include<iostream.h>#include<string.h>classThing{public:virtualvoidwhat_Am_I(){cout<<"IamaThing.\n";}~Thing(){cout<<"Thingdestructor"<<endl;}};classAnimal:publicThing{public:virtualvoidwhat_Am_I(){cout<<"IamanAnimal.\n";}~Animal(){cout<<"Animaldestructor"<<endl;}};voidmain(){Thing*t=newThing;Animal*x=newAnimal;Thing*array[2];array[0]=t;//basepointerarray[1]=x;for(inti=0;i<2;i++)array->what_Am_I();deletearray[0];deletearray[1];return;}--------------------------------------------------------------------------------純虛函數(shù),多態(tài)#include<iostream.h>#include<math.h>classPoint{private:doublex;doubley;public:Point(doublei,doublej):x(i),y(j){}voidprint()const{cout<<"("<<x<<","<<y<<")";}};classFigure{private:Pointcenter;public:Figure(doublei=0,doublej=0):center(i,j){}Point&location(){returncenter;}//returnanlvaluevoidmove(Pointp){center=p;draw();}virtualvoiddraw()=0;//drawthefigurevirtualvoidrotate(double)=0;//rotatethefigurebyanangle};classCircle:publicFigure{private:doubleradius;public:Circle(doublei=0,doublej=0,doubler=0):Figure(i,j),radius(r){}voiddraw(){cout<<"Acirclewithcenter";location().print();cout<<"andradius"<<radius<<endl;}voidrotate(double){cout<<"noeffect.\n";}//mustbedefined};classSquare:publicFigure{private:doubleside;//lengthofthesidedoubleangle;//theanglebetweenasideandthex-axispublic:Square(doublei=0,doublej=0,doubled=0,doublea=0):Figure(i,j),side(d),angle(a){}voiddraw(){cout<<"Asquarewithcenter";location().print();cout<<"sidelength"<<side<<".\n"<<"TheanglebetweenonesideandtheX-axisis"<<angle<<endl;}voidrotate(doublea){angle+=a;cout<<"TheanglebetweenonesideandtheX-axisis"<<angle<<endl;}voidvertices(){cout<<"Theverticesofthesquareare:\n";//calculatecoordinatesoftheverticesofthesquare}};intmain(){Circlec(1,2,3);Squares(4,5,6);Figure*f=&c,&g=s;f->draw();f->move(Point(2,2));g.draw();g.rotate(1);s.vertices();//Cannotusegheresincevertices()isnotamemberofFigure.return0;}////////////////////////////////////////////////////////////////////#include<iostream.h>#include<string.h>classThing{public:virtualvoidwhat_Am_I(){cout<<"IamaThing.\n";}~Thing(){cout<<"Thingdestructor"<<endl;}};classAnimal:publicThing{public:virtualvoidwhat_Am_I(){cout<<"IamanAnimal.\n";}~Animal(){cout<<"Animaldestructor"<<endl;}};voidmain(){Thingt;Animalx;Thing*array[2];array[0]=&t;//basepointerarray[1]=&x;for(inti=0;i<2;i++)array->what_Am_I();return;}--------------------------------------------------------------------------------多繼承#include<iostream.h>classA{private:inta;public:A(inti):a(i){}virtualvoidprint(){cout<<a<<endl;}intget_a(){returna;}};classB{private:intb;public:B(intj):b(j){}voidprint(){cout<<b<<endl;}intget_b(){returnb;}};classC:publicA,publicB{intc;public:C(inti,intj,intk):A(i),B(j),c(k){}voidprint(){A::print();B::print();}//useprint()withscoperesolutionvoidget_ab(){cout<<get_a()<<""<<get_b()<<endl;}//useget_a()andget_b()withoutscoperesolution};intmain(){Cx(5,8,10);A*ap=&x;B*bp=&x;ap->print();//useC::print();bp->print();//useB::print();//bp->A::print();//asifxisinheritedfromBonly,//cannotaccessA::print();x.A::print();//useA::print();x.get_ab();return0;}--------------------------------------------------------------------------------共同基類的多繼承#include<iostream.h>classR{intr;public:R(intanInt){r=anInt;};printOn(){cout<<"r="<<r<<endl;};};classA:publicR{inta;public:A(intint1,intint2):R(int2){a=int1;};};classB:publicR{intb;public:B(intint1,intint2):R(int2){b=int1;};};classC:publicA,publicB{intc;public:C(intint1,intint2,intint3):A(int2,int3),B(int2,int3){c=int1;}};intmain(){inti;Rrr(10);Aaa(20,30);Bbb(40,50);Ccc(5,7,9);rr.printOn();aa.printOn();//inheritsRprintOnbb.printOn();//inheritsRprintOn//cc.printOn();//wouldgiveerrorreturn0;}--------------------------------------------------------------------------------虛基類#include<iostream.h>classR{intr;public:R(intx=0):r(x){}//constructorinRvoidf(){cout<<"r="<<r<<endl;}voidprintOn(){cout<<"printOnR="<<r<<endl;}};classA:publicvirtualR{inta;public:A(intx,inty):R(x),a(y){}//constructorinAvoidf(){cout<<"a="<<a<<endl;R::f();}};classB:publicvirtualR{intb;public:B(intx,intz):R(x),b(z){}//constructorinBvoidf(){cout<<"b="<<b<<endl;R::f();}};classC:publicA,publicB{intc;public://constructorinC,whichconstructsanRobjectfirstC(intx,inty,intz,intw):R(x),A(x,y),B(x,z),c(w){}voidf(){cout<<"c="<<c<<endl;A::f();B::f();}};voidmain(){Rrr(1000);Aaa(2222,444);Bbb(3333,111);Ccc(1212,345,123,45);cc.printOn();//usesRprintOnbutonly1R..noambiguitycc.f();//showsmultiplecalloftheR::f()}////////////////////////////////////////#include<iostream.h>classR{intr;public:R(intx=0):r(x){}//constructorinRvoidf(){cout<<"r="<<r<<endl;}};classA:virtualpublicR{inta;protected:voidfA(){cout<<"a="<<a<<endl;};public:A(intx,inty):R(x),a(y){}//constructorinAvoidf(){fA();R::f();}};classB:virtualpublicR{intb;protected:voidfB(){cout<<"b="<<b<<endl;};public:B(intx,inty):R(x),b(y){}//constructorinAvoidf(){fB();R::f();}};classC:publicA,publicB{intc;protected:voidfC(){cout<<"c="<<c<<endl;};public:C(intx,inty,intz,intw):R(x),A(x,y),B(x,z),c(w){}voidf(){R::f();//actsonRstuffonlyA::fA();//actsonAstuffonlyB::fB();//actsonBstuffonlyfC();//actsonCstuffonly}};voidmain(){Rrr(1000);Aaa(2222,444);Bbb(3333,111);Ccc(1212,345,123,45);cc.f();}--------------------------------------------------------------------------------私有繼承//Accesslevels#include<iostream.h>classBase{private:intpriv;protected:intprot;intget_priv(){returnpriv;}public:intpubl;Base();Base(inta,intb,intc):priv(a),prot(b),publ(c){}intget_prot(){returnprot;}intget_publ(){returnpubl;}};classDerived1:privateBase//privateinheritance{public:Derived1(inta,intb,intc):Base(a,b,c){}intget1_priv(){returnget_priv();}//privnotaccessibledirectlyintget1_prot(){returnprot;}intget1_publ(){returnpubl;}};classLeaf1:publicDerived1{public:Leaf1(inta,intb,intc):Derived1(a,b,c){}voidprint(){cout<<"Leaf1members:"<<get1_priv()<<""http://<<get_priv()//notaccessible<<get1_prot()<<""http://<<get_prot()//notaccessible//<<publ//notaccessible<<get1_publ()<<endl;}//datamembersnotaccessible.get_functionsinBasenotaccessible};classDerived2:protectedBase//protectedinheritance{public:Derived2(inta,intb,intc):Base(a,b,c){}};classLeaf2:publicDerived2{public:Leaf2(inta,intb,intc):Derived2(a,b,c){}voidprint(){cout<<"Leaf2members:"<<get_priv()<<""http://<<priv//notaccessible<<prot<<""<<publ<<endl;}//publicandprotecteddatamembersaccessible.get_functionsinBaseaccessible.};classDerived3:publicBase//publicinheritance{public:Derived3(inta,intb,intc):Base(a,b,c){}};classLeaf3:publicDerived3{public:Leaf3(inta,intb,intc):Derived3(a,b,c){}voidprint(){cout<<"Leaf3members:"<<get_priv()<<""<<prot<<""<<publ<<endl;}//publicandprotecteddatamembersaccessible.get_functionsinBaseaccessible};intmain(){Derived1d1(1,2,3);Derived2d2(4,5,6);Derived3d3(7,8,9);//cout<<d1.publ;//notaccessible//cout<<d1.get_priv();//notaccessible//cout<<d2.publ;//notaccessible//cout<<d2.get_priv();//notaccessiblecout<<d3.publ;//OKcout<<d3.get_prot();//OKLeaf1lf1(1,2,3);Leaf2lf2(4,5,6);Leaf3lf3(7,8,9);//cout<<lf1.publ<<endl;//notaccessible//cout<<lf2.publ<<endl;//notaccessiblecout<<lf3.publ<<endl;//OKreturn0;}--------------------------------------------------------------------------------多級繼承//Point-Circle-Cylinder#include<iostream.h>//THEPOINTCLASSclassPoint{friendostream&operator<<(ostream&,Point&);public://constructorPoint(doublexval=0,doubleyval=0){x=xval;y=yval;};protected://accessedbyderivedclassdoublex;doubley;};ostream&operator<<(ostream&os,Point&apoint){cout<<"Point:X:Y:"<<apoint.x<<","<<apoint.y<<"\n";returnos;}//TheCircleclassinheritsfromclassPointclassCircle:publicPoint{friendostream&operator<<(ostream&,Circle&);public:Circle(doubler=0,doublexval=0,doubleyval=0):Point(xval,yval),radius(r){//radius=r;}doublearea(){return(3.14159*radius*radius);}protected:doubleradius;};//notecastingcircletopointostream&operator<<(ostream&os,Circle&aCircle){cout<<"Circle:radius:"<<aCircle.radius;os<<aCircle.x<<"\n";os<<aCircle.y<<"\n";returnos;}//THECYLINDERCLASSclassCylinder:publicCircle{friendostream&operator<<(ostream&,Cylinder&);public:Cylinder(doublehv=0,doublerv=0,doublexv=0,doubleyv=0):Circle(xv,yv,rv){height=hv;}doublearea();protected://mayhavederivedclassesdoubleheight;};doubleCylinder::area(){//NotethatcylinderareausesCircleareareturn2.0*Circle::area()+2.0*3.14159*radius*height;}ostream&operator<<(ostream&os,Cylinder&acylinder){cout<<"cylinderdimensions:";cout<<"x:"<<acylinder.x;cout<<"y:"<<acylinder.y;cout<<"radius:"<<acylinder.radius;cout<<"height:"<<acylinder.height<<endl;returnos;}intmain(void){Pointp(2,3);Circlec(7,6,5);Cylindercyl(10,11,12,13);cout<<p;cout<<c;cout<<"areaofcirle:"<<c.area()<<endl;cout<<cyl;cout<<"areaofcylinder:"<<cyl.area()<<endl;cout<<"areaofcylinderbaseis"<<cyl.Circle::area()<<endl;return0;}--------------------------------------------------------------------------------protected訪問控制屬性在繼承的意義//Exampleoftreatingderivedclassobjectasbaseclassobjects.Point------Circle#include<iostream.h>//THEPOINTCLASSclassPoint{friendostream&operator<<(ostream&,Circle&);public:Point(doublexval=0,doubleyval=0){x=xval;y=yval;};public:voidprint(){cout<<"Point:X:Y:"<<x<<","<<y<<"\n";}protected://accessedbyderivedclassdoublex;doubley;};ostream&operator<<(ostream&os,Point&apoint){cout<<"Point:X:Y:"<<apoint.x<<","<<apoint.y<<"\n";returnos;}//TheCircleclassinheritsfromclassPointclassCircle:publicPoint{friendostream&operator<<(ostream&,Circle&);public:Circle(doubler=0,doublexval=0,doubleyval=0):Point(xval,yval){radius=r;};voidprint(){cout<<"Circle:radius:"<<radius<<endl;cout<<"Point:X:Y:"<<x<<","<<y<<"\n";}doublearea(){return(3.14159*radius*radius);};protected:doubleradius;};//notecastingcircletopointostream&operator<<(ostream&os,Circle&aCircle){cout<<"Circle:radius:"<<aCircle.radius;cout<<(Point)aCircle<<"\n";returnos;}//Wewilllo

溫馨提示

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

評論

0/150

提交評論