學習C++的必要性
- 得益于它的高效性滋捶、穩(wěn)定性、跨平臺性惧财,所以應用范圍廣泛垮衷;
- 是很多語言的老祖宗帘靡,理解C++相當理解了很多流行語言的本質(zhì);
- C++是面向?qū)ο蠛兔嫦蜻^程都比較完善的語言戈次,更能接近本質(zhì)怯邪;
- 學幾種不同的編程語言利于在更高的維度的視角理解代碼悬秉;
- C++轉(zhuǎn)什么都快和泌,逼格高武氓;
程序的本質(zhì)
軟件仇箱、程序的執(zhí)行過程:
- 硬盤(程序軟件剂桥,可執(zhí)行文件权逗,機器碼) -- 裝載 --> 內(nèi)存
- 內(nèi)存 <--寫-- --讀--> CPU
- CPU --控制 --> 計算機 (顯示器旬迹、音響奔垦、話筒椿猎、其他設備)
寄存器與內(nèi)存:
- CPU會先將內(nèi)存中的數(shù)據(jù)存儲到寄存器中犯眠,然后再對寄存器中的數(shù)據(jù)進行計算
- 假設內(nèi)存中有塊空間的值是3筐咧,現(xiàn)想把它加1存儲到另一塊內(nèi)存空間
○ CPU首先將原內(nèi)存空間的值放到AX寄存器中:mov eax 铺罢,原內(nèi)存空間
○ AX寄存器與1相加:add eax韭赘,1
○ 賦值給另一塊內(nèi)存空間:mov, 另一塊內(nèi)存空間势就,eax
語言的發(fā)展:
高級語言-編譯->匯編語言<-反編譯--編譯->機器語言-運行->計算機
- 匯編語言與機器語言一一對應袖牙,每條機器指令都有對應的匯編指令
- 匯編語言 --編譯-->機器語言贼陶,機器語言 --反匯編-->匯編語言
- 高級語言 --編譯-->匯編語言/機器語言碉怔,但是反過來幾乎不可能轉(zhuǎn)換
編程語言之間的本質(zhì)區(qū)別
- C++撮胧、C芹啥、OC墓怀、Swift代碼 --編譯器編譯--> 匯編代碼 <--> 機器碼
○ C++:輕易反匯編 - JS傀履、PHP莉炉、Python代碼 --腳本引擎解析--> 中間代碼 --> 機器碼
○ JavaScript:腳本語言絮宁,瀏覽器解析绍昂;
○ PHP:腳本語言偿荷,Zend Engine解析 - Java跳纳、Ruby代碼 --編譯器編譯--> class字節(jié)碼 --JVM虛擬機--> 機器碼
C++語言
- 源文件擴展名.cpp
- 入口是main函數(shù)
- C++完全兼容C語言的語法
Cin棒旗、Cout
- cin铣揉、cout:進行控制臺的輸入、輸出
- getchar():等待鍵盤輸入台猴,如果敲擊回車就會讀取鍵盤輸入(可以阻斷程序結(jié)束饱狂,顯示控制臺內(nèi)容)
函數(shù)重載(Overload)
- 規(guī)則
○ 函數(shù)名相同
○ 參數(shù)個數(shù)不同,參數(shù)類型不同讲婚,參數(shù)順序不同 - 注意
○ 返回值類型與函數(shù)重載無關
○ 調(diào)用函數(shù)時,實參的隱式類型轉(zhuǎn)換可能會產(chǎn)生二義性
探索函數(shù)重載本質(zhì)
- 定義函數(shù)名相同雏婶,參數(shù)類型不同的函數(shù)
- 運行查看匯編代碼留晚,發(fā)現(xiàn)在Vistual Studio中,幾個函數(shù)在匯編中函數(shù)名完全一樣
○ 原因:其實名稱不一樣憨闰,但是VS的開發(fā)者做了優(yōu)化導致看起來都一樣 - 用IDA pro工具查看:把程序的exe文件拽到ida需五,能識別到時pe文件(windows的可執(zhí)行文件)
○ functionwindow會展示所有函數(shù)的名稱宏邮;
○ 編譯分為Debug模式和Release模式蜜氨,Debug模式東西太多不方便查看埋哟;Debug模式:很多調(diào)試信息,生成的可執(zhí)行文件比較臃腫赤赊;
Release模式:取出調(diào)試信息抛计,生成的可執(zhí)行文件比較精簡高效;
○ 關閉Release模式下的編譯優(yōu)化刘急,再次編譯叔汁,查看幾個函數(shù)名在匯編中分別變?yōu)閒uncname_0检碗、funcname_1、funcname_2折剃; - 本質(zhì)總結(jié):
○ 采用了name mangling/name decoration技術(shù)
○ C++編譯器默認會對符號名(如函數(shù)名)另假、進行改編己莺、修飾(命名傾軋)
○ 重載時會生成多個不同的函數(shù)名,不同編譯器(MSVC胜蛉、g++)有不同的生成規(guī)則
○ 通過IDA打開[VC_Release禁止優(yōu)化]可以查看