作者/侯曉琴 出版社/清華大學(xué)出版社
目錄
第1篇 Visual C++開發(fā)環(huán)境及語言基礎(chǔ)
- 開發(fā)環(huán)境及常用應(yīng)用程序框架
- C++入門基礎(chǔ)
- C++面向?qū)ο缶幊袒A(chǔ)
- MFC運行機制
第2篇 Visual Studio圖形編程
- 結(jié)合實例詳解Windows標(biāo)準(zhǔn)控件
- 菜單
- 編輯工具欄和狀態(tài)欄
- 圖形圖像
第3篇 Visual C++程序開發(fā)基礎(chǔ)篇
- 數(shù)據(jù)文件讀寫
- 動態(tài)鏈接庫
第4篇 Visual C++程序開發(fā)提高篇
- 多線程
- 網(wǎng)絡(luò)編程
- 數(shù)據(jù)庫編程
- 標(biāo)準(zhǔn)模板庫(STL)
- 電子書管理系統(tǒng)
第一章 開發(fā)環(huán)境及常用應(yīng)用程序框架
Visual C++是Microsoft公司開發(fā)的基于C/C++的可視化的集成開發(fā)工具,提供了Microsoft基本類庫MFC沉御。
#include<iostream> //輸入輸出語句的頭文件
using namespace std; //std作用域
cin>> <變量名> ; //輸入語句
cout<<"輸出的內(nèi)容"<< <變量名> <<endl; //輸出語句(endl換行)
return 0; //返回值
按F5調(diào)試程序 Ctrl F5運行程序
機器語言→匯編語言→高級語言C
C語言:結(jié)構(gòu)式語言——顯著特點:代碼及數(shù)據(jù)的分隔化
C→面向過程 / C++→面向對象
C+class→ C++
C++三大特性:封裝、繼承皂冰、多態(tài)
MFC應(yīng)用程序有3種類型:基于單文檔、基于多文檔养篓、基于對話框
MFC程序員常用3個類:CRect(限定一個區(qū)域)秃流、CPoint(定義一個點的二維坐標(biāo)值)、CString(對string的各種操作封裝起來變成一個只能在MFC下使用的類)
MFC窗口類WNDCLASS(并不是一個真正意義上的類)
.cpp→ .obj→ .exe
語法錯誤→ 跟蹤調(diào)試
調(diào)試菜單→ 新建斷點→ 跟蹤調(diào)試程序(跟屁蟲式跟蹤(逐語句/逐過程)F11柳弄、守株待兔式跟蹤F5)
Win32應(yīng)用程序(Win32 Application)
入口函數(shù)是WinMain()(有且只有一個)舶胀,是基于Windows平臺的32位開發(fā)環(huán)境開發(fā)的應(yīng)用程序,也是普通的窗口應(yīng)用程序碧注。有注冊窗口嚣伐、創(chuàng)建窗口、顯示窗口、消息處理等動作
Windows應(yīng)用程序→ 空項目
一個基本的Win32應(yīng)用程序要包括兩個函數(shù):WinMain()和實現(xiàn)窗口操作函數(shù)
應(yīng)用場合:針對需要重新編寫窗口
Win32控制臺程序(Win32 Console Application)
入口函數(shù)是main()(有且只有一個),運行結(jié)果窗口是MS-DOS的樣子揖铜,因為它是基于DOS平臺開發(fā)的應(yīng)用程序
應(yīng)用場合:針對需要測試完善的代碼,以便移植到其他框架下使用
MFC應(yīng)用程序(MFC Application)
入口函數(shù)是WinMain()(在工作區(qū)的文件中看不到)
應(yīng)用程序類型→ 單文檔 不添加任何代碼哄尔,MFC單文檔程序就能運行出結(jié)果
應(yīng)用場合:以MFC應(yīng)用程序為基本框架繼續(xù)開發(fā)自己的軟件,可以省去一大部分工作內(nèi)容
MFC動態(tài)鏈接庫(MFC DLL)
針對MFC應(yīng)用程序的動態(tài)鏈接庫,入口函數(shù)為DllMain(),類似于MFC應(yīng)用程序中的WinMain()耿导,在自動生成的文件是看不到的
DLL類型→ 使用共享MFC DLL的規(guī)則DLL
這種項目運行結(jié)果是沒有窗口的,因為它生成的并不是可執(zhí)行文件态贤,而是以.dll、.lib為后綴名的兩個文件醋火。如果想看結(jié)果悠汽,只需將其復(fù)制粘貼到可執(zhí)行程序的當(dāng)前路徑下,并且讓可執(zhí)行程序調(diào)用其結(jié)果即可芥驳。
應(yīng)用場合:當(dāng)所編的程序不希望被權(quán)限之外的人看到源代碼柿冲,以期保護原作者的權(quán)益,或者代碼被封裝成接口讓別人使用兆旬,只要憑借輸入輸出參數(shù)即可運用假抄。
開發(fā)環(huán)境:將多個項目形成一個集合、格式不規(guī)范的代碼被自動對齊(Ctrl K F(注意順序))
第二章 C++入門基礎(chǔ)
C++全面性(界面開發(fā)不如VB、應(yīng)用軟件的開發(fā)效率不如Java宿饱、代碼運行效率不如C)
C++數(shù)據(jù)類型分為基本與構(gòu)造兩大塊
- 基本類型:整型(基本整型int熏瞄、短整型short、長整型long谬以、無符號型unsigned)强饮、實型(浮點型)(單精度型float、雙精度型double为黎、擴展雙精度型long double)邮丰、字符型char、布爾型bool铭乾、空類型void
- 構(gòu)造類型:數(shù)組類型[]剪廉、指針類型*、結(jié)構(gòu)體類型struct炕檩、共用體類型union斗蒋、枚類型enum、類class
2字節(jié):短整型 4字節(jié):基本整型捧书、長整型吹泡、單精度浮點 8字節(jié):雙精度浮點(32位計算機)
常量和變量
——基礎(chǔ)數(shù)據(jù)類型
只要有賦值動作,變量的值一定會被改變/常量一經(jīng)定義值不會被改變经瓷,即使有賦值行為
常量的定義與說明:
1.使用預(yù)處理命令:#define 常量名 常量值(末尾不需要分號)
2.使用const來定義常量:const 數(shù)據(jù)類型 常量名=常量值爆哑;(賦值會出錯舆吮,必須在定義時初始化)
整型
——無符號可以和前三種結(jié)合使用揭朝,無符號顧名思義就是自然數(shù)(有符號的是整數(shù))
int -32768~32767 即總共2^16個(占2個存儲字節(jié),每個字節(jié)8位)
利用頭文件climits輸出不同數(shù)據(jù)類型的最大值與最小值色冀,例如cout<<INT_MAX<<endl或cout<<INT_MIN<<endl
整型潭袱、字符型數(shù)據(jù)的各種輸出變量可以進入limits.h頭文件查看
數(shù)據(jù)的定義和初始化:
1.類型修飾符 變量名;
** 變量名=數(shù)值;**
2.類型修飾符 變量名=數(shù)值;
浮點型數(shù)據(jù)的范圍和有效位可以進入cfloat頭文件查詢
科學(xué)計數(shù)法:a*10^b→ a e b
雙精度的有效位是15位 但是cout通常只輸出6個有效位
執(zhí)行cout.precision(n);或cout<<setprecision(n)(加入頭文件iomanip)后cout輸出的有效位數(shù)可達n個
字符型
——有符號字符、無符號字符 必須用單引號括起來且只能是一個字符
普通字符/轉(zhuǎn)義字符(\a響鈴锋恬、\n換行屯换、"雙引號、'單引號与学、\v豎向跳格彤悔、\b退格、\r回車索守、\反斜杠字符晕窑、\t制表符)
整數(shù)數(shù)據(jù)和字符數(shù)據(jù)是可以相互賦值的
布爾型
——只有兩種狀態(tài):false/true 也可用0/1表示 所占內(nèi)存1個字節(jié) 在運算中可以與整形相互轉(zhuǎn)化 扮演的角色是判斷某個狀態(tài)是否發(fā)生、條件是否成立等
空類型
——又稱為無值型 void 但不可以定義void類型的變量卵佛,一般用于函數(shù)的返回值和其參數(shù)類型
空類型void長度為0杨赤,值為空
用途:1.函數(shù)無返回值(如void main();) 2.函數(shù)不帶參數(shù)(如void main(void);) 3.定義通用指針(如void *p)
結(jié)構(gòu)體與共同體
不同點:內(nèi)部成員是否有聯(lián)系(結(jié)構(gòu)體-需要/共同體-不需要)敞斋、變量所占內(nèi)存長度(結(jié)構(gòu)體-各成員之和(各成員分別占用各自獨立的內(nèi)存)/共同體-最長的成員變量的長度(全部成員共同占用一段內(nèi)存))
書寫格式:struct/union 結(jié)構(gòu)體/共同體類型名{類型名 成員名;…};(大括號體外必須要有英文分號)
聲明結(jié)構(gòu)體或共同體意味著在有效作用域內(nèi)疾牲,又有了新的數(shù)據(jù)類型植捎,但是此時沒有開辟任何存儲空間,只有在定義該類型的變量后说敏,才會有相應(yīng)的空間鸥跟。
初始化方法:1.逐一賦值 2.結(jié)構(gòu)體類型名 變量名={成員1,成員2盔沫,成員3医咨,…};
共同體所有成員都享用1個內(nèi)存段,在每一瞬間共同體變量的內(nèi)存只能存放其中一種而不是存放所有架诞,也就是只有一個成員能實時地響應(yīng)拟淮,后面的被賦值成員會影響原有的成員,當(dāng)被訪問內(nèi)存時只有新成員起作用谴忧,因此共同體的初始化不能發(fā)生在定義共同體變量時很泊。
指針變量
——用來存放變量地址的變量
4個特性:
1.指針變量的值不是一般的地址而是變量的地址
2.指針變量的值不可以人為任意給定,而必須是嚴(yán)格遵循當(dāng)?shù)赜嬎銠C內(nèi)存的地址值
3.通過指針變量中的值沾谓,再加上特殊運算符可以訪問存放于該值的變量中的內(nèi)容
4.指針變量中存放的地址值委造,只能是同它類型一樣的變量的地址
定義:類型修飾符 *變量名;
初始化:類型修飾符 變量名1=對應(yīng)類型修飾符的任意值;
變量名=&變量名1;(&取地址運算符)
運用指針變量獲取地址所指向變量的值并改變它:變量名;
重要注意事項:在定義完指針變量后均驶,它就必須被初始化*
實現(xiàn)面向?qū)ο缶幊痰谋匾獥l件——類
父類→ 子類(共性→ 個性)
類包含兩部分:成員變量和成員函數(shù) 類中的成員變量和成員函數(shù)都相互有聯(lián)系(與結(jié)構(gòu)體的區(qū)別在于結(jié)構(gòu)體中只有變量昏兆,沒有函數(shù)的實現(xiàn))
類就是具有相同屬性的具體物質(zhì)的一種抽象概念,而它是共有屬性的定義妇穴、實現(xiàn)(變量和函數(shù))的集合
string類
string類就是對char的各種操作做了個封裝 #include<string>
string str,str1,str2; str=str1+str2;(str2若為char可組合)
compare():對兩個string變量進行比較(str.compare(str1))
length():獲取string變量長度(str.length())
find():在元變量中找目標(biāo)變量是從哪位開始(str.find(str1))
replace():替換(str,replace(a,b,"c")將第a到第b位換成c)
string變量的第1個字符是第0位
數(shù)組
數(shù)組的元素 編號/下標(biāo)從0開始算起 數(shù)組元素在內(nèi)存中連續(xù)存放
數(shù)組在定義時爬虱,數(shù)組大小可寫也可不寫
應(yīng)用讀寫數(shù)據(jù)——一維數(shù)組
定義:
1.數(shù)組大小被提前告知:數(shù)據(jù)類型 數(shù)組名[數(shù)組大小];
2.數(shù)組大小不被提前告知:數(shù)據(jù)類型 數(shù)組名[]; 初始化形式:數(shù)組名[]={變量1,變量2,變量3,…};(這種形式只有在數(shù)組元素全部明確的前提下才可以用)
強制轉(zhuǎn)換:(類型名)值
應(yīng)用圖像處理——二維數(shù)組
定義:數(shù)據(jù)類型 數(shù)組名[行數(shù)][列數(shù)];(這里的行數(shù)與列數(shù)也可不寫,但不提倡)
應(yīng)用處理字符串——字符型數(shù)組
長度為n的字符串需要n+1個字節(jié)的存儲空間(必須以\n結(jié)尾)
\0是一個ASCII碼值為0的不可顯示字符腾它,它標(biāo)志著字符串的結(jié)束
在字符數(shù)組的初始化過程中跑筝,如果不足位就會補足'\0'這個字符
運算符
賦值運算符:=
算數(shù)運算符:+ - * / % ++ --
邏輯運算符:&& || !
關(guān)系運算符:< <= > >= == !=
優(yōu)先級 | 運算符 | 具體功能 | 結(jié)合性 |
---|---|---|---|
1 | ++ -- | 位于變量后的自加瞒滴、自減符 | 從左到右 |
2 | () | 括號 | 從左到右 |
3 | ++ -- | 位于變量前的自加曲梗、自減符 | 從右到左 |
4 | ! | 非 | 從右到左 |
5 | * / % | 乘妓忍、除稀并、取余 | 從左到右 |
6 | + - | 加、減 | 從左到右 |
7 | < <= > >= | 小于单默、小于等于、大于忘瓦、大于等于 | 從左到右 |
8 | = 搁廓!= | 等于引颈、不等于 | 從左到右 |
9 | && | 與 | 從左到右 |
10 | ║ | 或 | 從左到右 |
11 | = | 賦值 | 從右到左 |
++(/--)x+n→先自增(/減)再計算 / x++(/--)+n→先計算再自增(/減)
在C++中對大于0的數(shù)值都是真,對小于等于0的數(shù)值都是假
流程控制語句
if-else / if-else if...-else
賦值表達式最后的條件始終為真
逗號表達式:按照從左往右逐個計算境蜕,但最終結(jié)果就是最后一個表達式
switch (<表達式>){
case <表達式結(jié)果整數(shù)值1>:<語句1>break;
case <表達式結(jié)果整數(shù)值2>:<語句2>break;
...
default:<語句n+1>break;
}
其中它的表達式的結(jié)果類型必須是整型的
for (<初始表達式>;<條件終止表達式>;<步長>)
{
//循環(huán)體
}
while(<條件表達式>)
{
//循環(huán)體
}
do
{
//循環(huán)體
}while(<條件表達式>);(勿漏分號)
while的條件表達式(不可省略)可以始終為真(如while(1))蝙场,但是必須要有break;防止變成死循環(huán)
for語句的<初始表達式>、<條件終止表達式>粱年、<步長>均可省略
函數(shù)
定義:返回類型 函數(shù)名 (形式參數(shù)表) 函數(shù)體
數(shù)據(jù)類型1 變量名1售滤,數(shù)據(jù)類型2 變量名2,…
return <返回值表達式>;
對于無返回值void型台诗,執(zhí)行返回值的語句可不寫或只寫return;
函數(shù)調(diào)用
遞歸調(diào)用是嵌套調(diào)用的一種特例
第三章 C++面向?qū)ο缶幊袒A(chǔ)
面向?qū)ο缶幊蹋好嫦虻氖蔷哂型环N屬性的事物
面向?qū)ο缶幊痰闹行乃枷刖褪菍⒖此茝?fù)雜的事物提取出相似的特征完箩,然后再處理不同的個性特征
程序運行期的基本實體——對象
實現(xiàn)面向?qū)ο缶幊痰谋匾獥l件——類
類擁有自己的成員變量和成員函數(shù),它是一些事物相同特性的體現(xiàn)者
類聲明一般形式:
class 類名
{
//定義體
}
類對象定義一般形式:類名 對象名;
類是一個抽象的虛擬的物質(zhì)拉队,而對象是實實在在存在的一個物體
實現(xiàn)程序的模塊化——封裝
對函數(shù)的封裝→函數(shù)體+參數(shù)接口
對類的封裝
函數(shù)具體實現(xiàn)過程是看不到的弊知,讀者只需懂得外部接口如何使用
實現(xiàn)系統(tǒng)的可重用及可擴展性——繼承
父類/基類→子類/派生類
同一消息為不同對象接受時產(chǎn)生完全不同的行為——多態(tài)
virtual(虛)和重寫
對象之間溝通的途徑——消息傳遞
對不同類成員變量的訪問權(quán)限:
類型 | 關(guān)鍵字 | 訪問權(quán)限描述 |
---|---|---|
公有成員 | public | 在其生命周期內(nèi),在任何地方都可以被訪問 |
私有成員 | private | 只能被該類的其他成員訪問粱快,外部函數(shù)甚至它的子類也不可以訪問 |
保護成員 | protected | 與私有成員一樣秩彤,但是它可以被其子類訪問 |
構(gòu)造函數(shù)
創(chuàng)建規(guī)則:
1.名字必須跟本類的類名一模一樣
2.構(gòu)造函數(shù)不可以有任何類型 的返回值,即使是void也不行
3.一個類的構(gòu)造函數(shù)可以被重載事哭,即可以有多個構(gòu)造函數(shù)
-
無參構(gòu)造函數(shù)(即默認(rèn))
在類內(nèi)被聲明:類名 ();
定義體:類名::類名 () { } -
帶參構(gòu)造函數(shù)
被聲明:類名 (<參數(shù)列表>);
定義體:類名::類名(<參數(shù)列表>){ }
默認(rèn)構(gòu)造函數(shù)只會執(zhí)行創(chuàng)建對象的動作漫雷,不會給對象執(zhí)行任何初始化工作
當(dāng)對象一旦被創(chuàng)建,系統(tǒng)就會自動給對象分配內(nèi)存空間并調(diào)用其構(gòu)造函數(shù)
當(dāng)一個類的對象是另一個類的成員變量時鳍咱,先調(diào)用類內(nèi)成員變量(另一個類對象)的構(gòu)造函數(shù)降盹,再調(diào)用自身的構(gòu)造函數(shù)。
默認(rèn)構(gòu)造函數(shù) / 默認(rèn)參數(shù)的構(gòu)造函數(shù):如果對象沒有初始值就用默認(rèn)值
這兩種構(gòu)造函數(shù)不能同時存在
析構(gòu)函數(shù)
創(chuàng)建規(guī)則:
1.同構(gòu)造函數(shù)一樣無返回類型流炕,也無參數(shù)
2.函數(shù)是在構(gòu)造函數(shù)名前加一個~邏輯非運算符
3.不可以被重載澎现,可以在析構(gòu)函數(shù)體重自行寫釋放資源的語句也可不寫
類內(nèi)被聲明:~類名 ();
定義體:類名::~類名 () { }
析構(gòu)函數(shù)-處理回收資源的任務(wù)
初始化對象時,先調(diào)用被調(diào)用類的構(gòu)造函數(shù)每辟,再調(diào)用主類的構(gòu)造函數(shù)剑辫,而釋放資源時先釋放主類的,再釋放被調(diào)用類的
重載構(gòu)造函數(shù):究竟調(diào)用哪個構(gòu)造函數(shù)得看創(chuàng)建對象時的格式
復(fù)制構(gòu)造函數(shù):對于相同類定義的不同對象渠欺,可以用一個對象去構(gòu)造另一個對象妹蔽。此時被賦值的另一個對象調(diào)用的構(gòu)造函數(shù)就稱為復(fù)制構(gòu)造函數(shù)
<指針變量> = new int[n] //聲明n個字節(jié)的內(nèi)存
delete [ ] <指針變量> //釋放內(nèi)存
new/delete和malloc/free的區(qū)別
1.new/delete是C++的操作符,對對象操作挠将,是保留字胳岂,不需要頭文件支持 / malloc/free是C中的函數(shù),對內(nèi)存空間操作舔稀,需要頭文件庫函數(shù)支持
2.new→分配內(nèi)存+調(diào)用對象的構(gòu)造函數(shù) / delete→調(diào)用對象的析構(gòu)函數(shù)+釋放內(nèi)存乳丰;malloc/free→分配和釋放內(nèi)存。
3.new:建立一個對象/malloc:分配一塊內(nèi)存内贮;new建立的對象可以用成員函數(shù)訪問产园,不要直接訪問它的地址空間 / malloc分配的是一塊內(nèi)存區(qū)域汞斧,用指針訪問,可以在里面移動指針什燕;new出來的指針是帶有類型信息的 / malloc返回的是void指針粘勒。
4.使用free釋放時需要判斷指針是否為NULL,delete不用
虛函數(shù)
一般在基類中進行