0.我們的公眾號:尋常幾盞燈火躲雅,歡迎前往,更多面經(jīng)內(nèi)推屠缭,祝您早日拿到offer奧~
1.進(jìn)程和線程的區(qū)別箍鼓,有了進(jìn)程為什么還要有線程
2.進(jìn)程的資源、線程的資源
3.多線程怎么同步呵曹,多線程競爭怎么解決
4.進(jìn)程通信
5.線程之間的通信方式
6.一次完整的http請求過程
7.http和https區(qū)別款咖,哪個更快
8.https加密過程
9.HTTP和TCP的區(qū)別
10.DNS域名解析過程,用到了什么協(xié)議(UDP)奄喂,最后獲得IP地址就能怎樣呢(就可以識別在網(wǎng)絡(luò)中的機(jī)器)
11.TCP和UDP區(qū)別以及各自使用場景铐殃,UDP不可靠的話那為什么咱們現(xiàn)在視頻這么流暢,是依靠什么
12.TCP擁塞控制
13.udp可以實(shí)現(xiàn)的功能
14.如何使UDP達(dá)到和TCP相同的效果
15.new malloc區(qū)別
16.new/delete跨新,malloc/free富腊,delete/delete[]?
17.static關(guān)鍵字
18.static應(yīng)用場景
19.虛函數(shù)的作用和底層實(shí)現(xiàn)(實(shí)現(xiàn)多態(tài),虛表 虛表指針)
20.哪些函數(shù)不能是虛函數(shù)域帐,構(gòu)造函數(shù)為什么不行
題目解析
1.
區(qū)別:
1. 進(jìn)程是資源分配的最小單位赘被,線程是程序執(zhí)行的最小單位(資源調(diào)度的最小單位)
2. 進(jìn)程有自己的獨(dú)立地址空間,每啟動一個進(jìn)程俯树,系統(tǒng)就會為它分配地址空間帘腹,建立數(shù)據(jù)表來維護(hù)代碼段贰盗、堆棧段和數(shù)據(jù)段许饿,這種操作非常昂貴。
而線程是共享進(jìn)程中的數(shù)據(jù)的舵盈,使用相同的地址空間陋率,因此CPU切換一個線程的花費(fèi)遠(yuǎn)比進(jìn)程要小很多,同時創(chuàng)建一個線程的開銷也比進(jìn)程要小很多秽晚。
3. 線程之間的通信更方便瓦糟,同一進(jìn)程下的線程共享全局變量、靜態(tài)變量等數(shù)據(jù)赴蝇,而進(jìn)程之間的通信需要以通信的方式(IPC)進(jìn)行菩浙。不過如何處理好同步與互斥是編寫多線程程序的難點(diǎn)。
4. 但是多進(jìn)程程序更健壯,多線程程序只要有一個線程死掉劲蜻,整個進(jìn)程也死掉了陆淀,而一個進(jìn)程死掉并不會對另外一個進(jìn)程造成影響,因?yàn)檫M(jìn)程有自己獨(dú)立的地址空間先嬉。
為什么:
進(jìn)程屬于在CPU和系統(tǒng)資源等方面提供的抽象轧苫,能夠有效提高CPU的利用率。
線程是在進(jìn)程這個層次上提供的一層并發(fā)的抽象:
(1)能夠使系統(tǒng)在同一時間能夠做多件事情疫蔓;
(2)當(dāng)進(jìn)程遇到阻塞時含懊,例如等待輸入,線程能夠使不依賴輸入數(shù)據(jù)的工作繼續(xù)執(zhí)行
(3)可以有效地利用多處理器和多核計算機(jī)衅胀,在沒有線程之前岔乔,多核并不能讓一個進(jìn)程的執(zhí)行速度提高
2.
一、堆與棧
堆: 是大家共有的空間滚躯,分全局堆和局部堆重罪。全局堆就是所有沒有分配的空間,局部堆就是用戶分配的空間哀九。堆在操作系統(tǒng)對進(jìn)程初始化的時候分配剿配,運(yùn)行過程中也可以向系統(tǒng)要額外的堆,但是記得用完了要還給操作系統(tǒng)阅束,要不然就是內(nèi)存泄漏呼胚。
棧:是個線程獨(dú)有的,保存其運(yùn)行狀態(tài)和局部自動變量的息裸。棧在線程開始的時候初始化蝇更,每個線程的棧互相獨(dú)立呼盆,因此年扩,棧是 thread safe的。操作系統(tǒng)在切換線程的時候會自動的切換棧访圃,就是切換〕谩SS/ESP寄存器。椡仁保空間不需要在高級語言里面顯式的分配和釋放况脆。
二、其他
線程共享的環(huán)境包括:進(jìn)程代碼段批糟、進(jìn)程的公有數(shù)據(jù)(利用這些共享的數(shù)據(jù)格了,線程很容易的實(shí)現(xiàn)相互之間的通訊)、進(jìn)程打開的文件描述符徽鼎、信號的處理器盛末、進(jìn)程的當(dāng)前目錄和進(jìn)程用戶ID與進(jìn)程組ID弹惦。
進(jìn)程擁有這許多共性的同時,還擁有自己的個性悄但。有了這些個性肤频,線程才能實(shí)現(xiàn)并發(fā)性。這些個性包括:
1.線程ID
每個線程都有自己的線程ID算墨,這個ID在本進(jìn)程中是唯一的宵荒。進(jìn)程用此來標(biāo)識線程。
2.寄存器組的值
由于線程間是并發(fā)運(yùn)行的净嘀,每個線程有自己不同的運(yùn)行線索报咳,當(dāng)從一個線程切換到另一個線程上時,必須將原有的線程的寄存器集合的狀態(tài)保存挖藏,以便將來該線程在被重新切換到時能得以恢復(fù)暑刃。
3.線程的堆棧
堆棧是保證線程獨(dú)立運(yùn)行所必須的。線程函數(shù)可以調(diào)用函數(shù)膜眠,而被調(diào)用函數(shù)中又是可以層層嵌套的岩臣,所以線程必須擁有自己的函數(shù)堆棧,使得函數(shù)調(diào)用可以正常執(zhí)行宵膨,不受其他線程的影響架谎。
4.錯誤返回碼
由于同一個進(jìn)程中有很多個線程在同時運(yùn)行,可能某個線程進(jìn)行系統(tǒng)調(diào)用
后設(shè)置了errno值辟躏,而在該線程還沒有處理這個錯誤谷扣,另外一個線程就在此時
被調(diào)度器投入運(yùn)行,這樣錯誤值就有可能被修改捎琐。
所以会涎,不同的線程應(yīng)該擁有自己的錯誤返回碼變量。
5.線程的信號屏蔽碼
由于每個線程所感興趣的信號不同瑞凑,所以線程的信號屏蔽碼應(yīng)該由線程自
己管理末秃。但所有的線程都共享同樣的信號處理器。
6.線程的優(yōu)先級
由于線程需要像進(jìn)程那樣能夠被調(diào)度籽御,那么就必須要有可供調(diào)度使用的參
數(shù)练慕,這個參數(shù)就是線程的優(yōu)先級。
3.
C++線程同步的四種方式:互斥鎖篱蝇,條件變量贺待,讀寫鎖徽曲,信號量
5.
1. 使用全局變量?
主要由于多個線程可能更改全局變量零截,因此全局變量最好聲明為volatile
2. 使用消息實(shí)現(xiàn)通信?
在Windows程序設(shè)計中,每一個線程都可以擁有自己的消息隊列(UI線程默認(rèn)自帶消息隊列和消息循環(huán)秃臣,工作線程需要手動實(shí)現(xiàn)消息循環(huán))涧衙,因此可以采用消息進(jìn)行線程間通信sendMessage,postMessage哪工。?
1)定義消息#define WM_THREAD_SENDMSG=WM_USER+20;?
2)添加消息函數(shù)聲明afx_msg int OnTSendmsg();??
3)添加消息映射ON_MESSAGE(WM_THREAD_SENDMSG,OnTSM)??
4)添加OnTSM()的實(shí)現(xiàn)函數(shù);?
5)在線程函數(shù)中添加PostMessage消息Post函數(shù)
3. 使用事件CEvent類實(shí)現(xiàn)線程間通信?
Event對象有兩種狀態(tài):有信號和無信號弧哎,線程可以監(jiān)視處于有信號狀態(tài)的事件雁比,以便在適當(dāng)?shù)臅r候執(zhí)行對事件的操作。?
1)創(chuàng)建一個CEvent類的對象:CEvent threadStart;它默認(rèn)處在未通信狀態(tài)撤嫩;??
2)threadStart.SetEvent();使其處于通信狀態(tài)偎捎;??
3)調(diào)用WaitForSingleObject()來監(jiān)視CEvent對象
6.
一個完整的HTTP過程包括建立連接、數(shù)據(jù)傳輸序攘、斷開連接等七個步驟茴她。
1. TCP建立連接?
HTTP協(xié)議是基于TCP協(xié)議來實(shí)現(xiàn)的,因此首先就是要通過TCP三次握手與服務(wù)器端建立連接程奠,一般HTTP默認(rèn)的端口號為80丈牢;
2. 瀏覽器發(fā)送請求命令?
在與服務(wù)器建立連接后,Web瀏覽器會想服務(wù)器發(fā)送請求命令
3. 瀏覽器發(fā)送請求頭消息?
在瀏覽器發(fā)送請求命令后瞄沙,還會發(fā)送一些其它信息己沛,最后以一行空白內(nèi)容告知服務(wù)器已經(jīng)完成頭信息的發(fā)送;
4. 服務(wù)器應(yīng)答?
在收到瀏覽器發(fā)送的請求后距境,服務(wù)器會對其進(jìn)行回應(yīng)申尼,應(yīng)答的第一部分是協(xié)議的版本號和應(yīng)答狀態(tài)碼;
5. 服務(wù)器回應(yīng)頭信息?
與瀏覽器端同理垫桂,服務(wù)器端也會將自身的信息發(fā)送一份至瀏覽器
6. 服務(wù)器發(fā)送數(shù)據(jù)?
在完成所有應(yīng)答后晶姊,會以Content-Type應(yīng)答頭信息所描述的格式發(fā)送用戶所需求的數(shù)據(jù)信息
7. 斷開TCP連接?
在完成此次數(shù)據(jù)通信后,服務(wù)器會通過TCP四次揮手主動斷開連接伪货。但若此次連接為長連接们衙,那么瀏覽器或服務(wù)器的頭信息會加入keep-alive的信息,會保持此連接狀態(tài)碱呼,在有其它數(shù)據(jù)發(fā)送時蒙挑,可以節(jié)省建立連接的時間。
7.
Http更快愚臀。
8.
https證書加密的第一步是認(rèn)證服務(wù)器忆蚀。
一些主流瀏覽器會內(nèi)置一個受信任的CA機(jī)構(gòu)列表,并會保存相關(guān)CA機(jī)構(gòu)的https證書姑裂。當(dāng)用戶在訪問部署了https證書的網(wǎng)站時馋袜,服務(wù)器會提供經(jīng)CA機(jī)構(gòu)頒發(fā)的https證書,如果認(rèn)證該服務(wù)器證書的CA機(jī)構(gòu)是存在于瀏覽器的受信任CA機(jī)構(gòu)列表當(dāng)中舶斧,并且該https證書中的所有信息均與當(dāng)前證在訪問的網(wǎng)站所有信息一致欣鳖,那么瀏覽器就會認(rèn)為服務(wù)端是可信的,并從https證書中取得公鑰(也就是CSR文件)茴厉,用于后面的流程泽台。
https證書加密的第二步是協(xié)商會話秘鑰什荣。
在服務(wù)器認(rèn)證完獲取公鑰之后,利用公鑰與服務(wù)器進(jìn)行加密通信怀酷,協(xié)商出兩個會話秘鑰稻爬,用于加密客戶端和加密服務(wù)端互發(fā)數(shù)據(jù)時的會話秘鑰。這個秘鑰是隨機(jī)生成的蜕依,每一次協(xié)商產(chǎn)生的結(jié)果都不一樣桅锄,所以安全性也是比較高的。
https證書加密的第三步是加密傳輸样眠。
當(dāng)客戶端和服務(wù)器端都擁有了協(xié)商的會話密鑰之后竞滓,進(jìn)行數(shù)據(jù)傳輸時,都是以密文的方式進(jìn)行傳輸吹缔。這樣的傳輸方式商佑,保證了數(shù)據(jù)的私密性和完整性,再也不用擔(dān)心數(shù)據(jù)在傳輸過程中被第三者竊取和篡改了厢塘。
https證書加密完成這三步茶没,就表示很完美的進(jìn)行了一次數(shù)據(jù)加密傳輸。只要你申請的https證書是由受信任的CA機(jī)構(gòu)(比如Symantec晚碾、Geotrust抓半、Comodo以及RapidSSL等)頒發(fā)的,都可以保障網(wǎng)絡(luò)的基本安全格嘁。
9.
TCP是傳輸層協(xié)議笛求,定義數(shù)據(jù)傳輸和連接方式的規(guī)范。握手過程中傳送的包里不包含數(shù)據(jù)糕簿,三次握手完畢后探入,客戶端與服務(wù)器才正式開始傳送數(shù)據(jù)。
HTTP 超文本傳送協(xié)議(Hypertext Transfer Protocol )是應(yīng)用層協(xié)議懂诗,定義的是傳輸數(shù)據(jù)的內(nèi)容的規(guī)范蜂嗽。
HTTP協(xié)議中的數(shù)據(jù)是利用TCP協(xié)議傳輸?shù)模攸c(diǎn)是客戶端發(fā)送的每次請求都需要服務(wù)器回送響應(yīng)殃恒,它是TCP協(xié)議族中的一種植旧,默認(rèn)使用 TCP 80端口。
10.
UDP
就可以識別在網(wǎng)絡(luò)中的機(jī)器
11.
1离唐、面向連接VS無連接
TCP建立一個連接需要3次握手IP數(shù)據(jù)包病附,斷開連接需要4次握手。另外斷開連接時發(fā)起方可能進(jìn)入TIME_WAIT狀態(tài)長達(dá)數(shù)分鐘(視系統(tǒng)設(shè)置亥鬓,windows一般為120秒)完沪,在此狀態(tài)下連接(端口)無法被釋放。
UDP不需要建立連接贮竟,可以直接發(fā)起丽焊。
2较剃、可靠VS不可靠
TCP利用握手咕别、ACK和重傳機(jī)制技健,udp沒有。
(1)校驗(yàn)和(校驗(yàn)數(shù)據(jù)是否損壞)惰拱;
(2)定時器(分組丟失則重傳)雌贱;
(3)序列號(用于檢測丟失的分組和重復(fù)的分組);
(4)確認(rèn)應(yīng)答ACK(接收方告知發(fā)送方正確接收分組以及期望的下一個分組)偿短;
(5)否定確認(rèn)(接收方通知發(fā)送方未被正確接收的分組)欣孤;
(6)窗口和流水線(用于增加信道的吞吐量)。(窗口大形舳骸:無需等待確認(rèn)應(yīng)答而可以繼續(xù)發(fā)送數(shù)據(jù)的最大值)
3降传、有序性
TCP利用seq序列號對包進(jìn)行排序,udp沒有勾怒。
4婆排、面向字節(jié)流vs面向報文
(1)面向報文
面向報文的傳輸方式是應(yīng)用層交給UDP多長的報文,UDP就照樣發(fā)送笔链,即一次發(fā)送一個報文段只。因此,應(yīng)用程序必須選擇合適大小的報文鉴扫。若報文太長赞枕,則IP層需要分片。UDP對應(yīng)用層交下來的報文坪创,既不合并炕婶,也不拆分,而是保留這些報文的邊界莱预。這也就是說古话,應(yīng)用層交給UDP多長的報文,UDP就照樣發(fā)送锁施,即一次發(fā)送一個報文陪踩。(一個upd的最大報文長度2^16-1-20-8,20是ip報文頭,8是udp報文頭)
(2)面向字節(jié)流
面向字節(jié)流的話悉抵,雖然應(yīng)用程序和TCP的交互是一次一個數(shù)據(jù)塊(大小不等)肩狂,但TCP把應(yīng)用程序看成是一連串的無結(jié)構(gòu)的字節(jié)流。TCP有一個緩沖姥饰,當(dāng)應(yīng)用程序傳送的數(shù)據(jù)塊太長傻谁,TCP就可以把它劃分短一些再傳送。如果應(yīng)用程序一次只發(fā)送一個字節(jié)列粪,TCP也可以等待積累有足夠多的字節(jié)后再構(gòu)成報文段發(fā)送出去审磁。
5谈飒、tcp有流量控制,udp沒有
6态蒂、tcp的頭部比20bytes杭措,udp8byres
TCP應(yīng)用場景:
效率要求相對低,但對準(zhǔn)確性要求相對高的場景钾恢。因?yàn)閭鬏斨行枰獙?shù)據(jù)確認(rèn)手素、重發(fā)、排序等操作瘩蚪,相比之下效率沒有UDP高泉懦。舉幾個例子:文件傳輸(準(zhǔn)確高要求高、但是速度可以相對慢)疹瘦、接受郵件崩哩、遠(yuǎn)程登錄。
UDP應(yīng)用場景:
效率要求相對高言沐,對準(zhǔn)確性要求相對低的場景邓嘹。舉幾個例子:QQ聊天、在線視頻呢灶、網(wǎng)絡(luò)語音電話(即時通訊吴超,速度要求高,但是出現(xiàn)偶爾斷續(xù)不是太大問題鸯乃,并且此處完全不可以使用重發(fā)機(jī)制)鲸阻、廣播通信(廣播、多播)缨睡。
UDP 要保證可靠鸟悴,就依賴于重傳
12.
1.慢開始
2.擁塞控制
3.快重傳
4.快恢復(fù)
13.
簡單的聊天功能、在線視頻奖年、網(wǎng)絡(luò)語音電話
14.
UDP要達(dá)到TCP的功能就必須實(shí)現(xiàn)擁塞控制的功能
15.
1细诸、malloc與free是c++/c語言的標(biāo)準(zhǔn)函數(shù),new/delete是C++的運(yùn)算符陋守。
2震贵、他們都可用于申請動態(tài)內(nèi)存和釋放內(nèi)存。new/delete比malloc/free更加智能水评,其實(shí)底層也是執(zhí)行的malloc/free猩系。為啥說new/delete更加的智能?因?yàn)閚ew和delete在對象創(chuàng)建的時候自動執(zhí)行構(gòu)造函數(shù)中燥,對象消亡之前會自動執(zhí)行析構(gòu)函數(shù)寇甸。
既然new/delete的功能完全覆蓋了malloc和free,為什么C++中不把malloc/free淘汰出局呢?因?yàn)閏++程序經(jīng)常要調(diào)用c函數(shù)拿霉,而c程序智能用malloc/free管理動態(tài)內(nèi)存吟秩。
3、new返回指定類型的指針绽淘,并且可以自動計算出所需要的大小涵防。如 :
int *p; p = new int; //返回類型為int*類型,大小為sizeof(int);
int *pa; pa = new int[50];//返回類型為int *收恢,大小為sizeof(int) * 100;
malloc必須用戶指定大小武学,并且默然返回類型為void*,必須強(qiáng)行轉(zhuǎn)換為實(shí)際類型的指針祭往。
16.
1伦意、new/delete是C++的操作符,而malloc/free是C中的函數(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氮墨、new/delete是保留字纺蛆,不需要頭文件支持;malloc/free需要頭文件庫函數(shù)支持规揪。
17.
1.先來介紹它的第一條也是最重要的一條:隱藏桥氏。(static函數(shù),static變量均可)
當(dāng)同時編譯多個文件時粒褒,所有未加static前綴的全局變量和函數(shù)都具有全局可見性识颊。
2.static的第二個作用是保持變量內(nèi)容的持久。(static變量中的記憶功能和全局生存期)
存儲在靜態(tài)數(shù)據(jù)區(qū)的變量會在程序剛開始運(yùn)行時就完成初始化,也是唯一的一次初始化祥款。共有兩種變量存儲在靜態(tài)存儲區(qū):全局變量和static變量清笨,只不過和全局變量比起來,static可以控制變量的可見范圍刃跛,說到底static還是用來隱藏的抠艾。
3.static的第三個作用是默認(rèn)初始化為0(static變量)
其實(shí)全局變量也具備這一屬性,因?yàn)槿肿兞恳泊鎯υ陟o態(tài)數(shù)據(jù)區(qū)桨昙。在靜態(tài)數(shù)據(jù)區(qū)检号,內(nèi)存中所有的字節(jié)默認(rèn)值都是0x00,某些時候這一特點(diǎn)可以減少程序員的工作量蛙酪。比如初始化一個稀疏矩陣齐苛,我們可以一個一個地把所有元素都置0,然后把不是0的幾個元素賦值桂塞。如果定義成靜態(tài)的凹蜂,就省去了一開始置0的操作。
4.static的第四個作用:C++中的類成員聲明static(有些地方與以上作用重疊)
在類中聲明static變量或者函數(shù)時阁危,初始化時使用作用域運(yùn)算符來標(biāo)明它所屬類玛痊,因此,靜態(tài)數(shù)據(jù)成員是類的成員狂打,而不是對象的成員擂煞,這樣就出現(xiàn)以下作用:
(1)類的靜態(tài)成員函數(shù)是屬于整個類而非類的對象,所以它沒有this指針趴乡,這就導(dǎo)致 了它僅能訪問類的靜態(tài)數(shù)據(jù)和靜態(tài)成員函數(shù)对省。?
(2)不能將靜態(tài)成員函數(shù)定義為虛函數(shù)。?
(3)由于靜態(tài)成員聲明于類中浙宜,操作于其外官辽,所以對其取地址操作,就多少有些特殊 粟瞬,變量地址是指向其數(shù)據(jù)類型的指針 同仆,函數(shù)地址類型是一個“nonmember函數(shù)指針”。
(4)由于靜態(tài)成員函數(shù)沒有this指針裙品,所以就差不多等同于nonmember函數(shù)俗批,結(jié)果就 產(chǎn)生了一個意想不到的好處:成為一個callback函數(shù),使得我們得以將C++和C-based X W indow系統(tǒng)結(jié)合市怎,同時也成功的應(yīng)用于線程函數(shù)身上岁忘。 (這條沒遇見過)?
(5)static并沒有增加程序的時空開銷,相反她還縮短了子類對父類靜態(tài)成員的訪問 時間区匠,節(jié)省了子類的內(nèi)存空間干像。?
(6)靜態(tài)數(shù)據(jù)成員在<定義或說明>時前面加關(guān)鍵字static帅腌。?
(7)靜態(tài)數(shù)據(jù)成員是靜態(tài)存儲的,所以必須對它進(jìn)行初始化麻汰。 (程序員手動初始化速客,否則編譯時一般不會報錯,但是在Link時會報錯誤)?
(8)靜態(tài)成員初始化與一般數(shù)據(jù)成員初始化不同:
初始化在類體外進(jìn)行五鲫,而前面不加static溺职,以免與一般靜態(tài)變量或?qū)ο笙嗷煜?/p>
初始化時不加該成員的訪問權(quán)限控制符private,public等位喂;??
初始化時使用作用域運(yùn)算符來標(biāo)明它所屬類浪耘;
所以我們得出靜態(tài)數(shù)據(jù)成員初始化的格式:
<數(shù)據(jù)類型><類名>::<靜態(tài)數(shù)據(jù)成員名>=<值>
(9)為了防止父類的影響,可以在子類定義一個與父類相同的靜態(tài)變量塑崖,以屏蔽父類的影響七冲。這里有一點(diǎn)需要注意:我們說靜態(tài)成員為父類和子類共享,但我們有重復(fù)定義了靜態(tài)成員弃舒,這會不會引起錯誤呢癞埠?不會状原,我們的編譯器采用了一種絕妙的手法:name-mangling 用以生成唯一的標(biāo)志聋呢。
18.
1. 出現(xiàn)在類體外的函數(shù)定義不能指定關(guān)鍵字static;//static 是申明時候用的
2. 靜態(tài)成員之間可以相互訪問颠区,包括靜態(tài)成員函數(shù)訪問靜態(tài)數(shù)據(jù)成員和訪問靜態(tài)成員函數(shù)削锰;
非靜態(tài)成員函數(shù)可以任意地訪問靜態(tài)成員函數(shù)和靜態(tài)數(shù)據(jù)成員;
3. 靜態(tài)成員函數(shù)不能訪問非靜態(tài)成員函數(shù)和非靜態(tài)數(shù)據(jù)成員毕莱;
4. 由于沒有this指針的額外開銷器贩,因此靜態(tài)成員函數(shù)與類的全局函數(shù)相比速度上會有少許的增長;
5. 調(diào)用靜態(tài)成員函數(shù)朋截,可以用成員訪問操作符(.)和(->)為一個類的對象或指向類對象的指針調(diào)用靜態(tài)成員函數(shù)蛹稍,也可以直接使用如下格式:
<類名>::<靜態(tài)成員函數(shù)名>(<參數(shù)表>)?
6. 調(diào)用類的靜態(tài)成員函數(shù)。
19.
C++中的虛函數(shù)的作用主要是實(shí)現(xiàn)了多態(tài)的機(jī)制部服∷艚悖基類定義虛函數(shù),子類可以重寫該函數(shù)廓八;在派生類中對基類定義的虛函數(shù)進(jìn)行重寫時奉芦,需要再派生類中聲明該方法為虛方法。
C++虛函數(shù)的底層實(shí)現(xiàn)原理
參考:https://blog.csdn.net/u011000290/article/details/50498683
20.
常見的不能聲明為虛函數(shù)的有:普通函數(shù)(非成員函數(shù))剧蹂、靜態(tài)成員函數(shù)声功、內(nèi)聯(lián)成員函數(shù)、構(gòu)造函數(shù)宠叼、友元函數(shù)先巴。
為什么:
1.調(diào)用虛函數(shù)需要訪問虛表,構(gòu)造函數(shù)在調(diào)用前根本不存在虛表,這帶來了先有雞還是先有蛋的問題伸蚯;
2.多態(tài)是根據(jù)指針指向的具體對象類型調(diào)用對應(yīng)的方法醋闭,前提當(dāng)然是這個對象是已經(jīng)構(gòu)建出來了;
3.構(gòu)造函數(shù)是定義一個對象時自動調(diào)用的朝卒,用戶不能自己調(diào)用構(gòu)造函數(shù)证逻,所以沒必要是虛函數(shù);