字節(jié)跳動 C++面經(jīng)總結(jié)及解析 第一期

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ù);

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末抗斤,一起剝皮案震驚了整個濱河市囚企,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌瑞眼,老刑警劉巖龙宏,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異伤疙,居然都是意外死亡银酗,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進(jìn)店門徒像,熙熙樓的掌柜王于貴愁眉苦臉地迎上來黍特,“玉大人,你說我怎么就攤上這事锯蛀∶鹬裕” “怎么了?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵旁涤,是天一觀的道長翔曲。 經(jīng)常有香客問我,道長劈愚,這世上最難降的妖魔是什么瞳遍? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任垮衷,我火速辦了婚禮示绊,結(jié)果婚禮上排霉,老公的妹妹穿的比我還像新娘摆舟。我一直安慰自己施蜜,他們只是感情好降宅,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布驹尼。 她就那樣靜靜地躺著衡未,像睡著了一般氓轰。 火紅的嫁衣襯著肌膚如雪婚夫。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天署鸡,我揣著相機(jī)與錄音案糙,去河邊找鬼限嫌。 笑死,一個胖子當(dāng)著我的面吹牛时捌,可吹牛的內(nèi)容都是我干的怒医。 我是一名探鬼主播,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼奢讨,長吁一口氣:“原來是場噩夢啊……” “哼稚叹!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起拿诸,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤扒袖,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后亩码,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體季率,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年描沟,在試婚紗的時候發(fā)現(xiàn)自己被綠了飒泻。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,654評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡吏廉,死狀恐怖泞遗,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情迟蜜,我是刑警寧澤刹孔,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站娜睛,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏卦睹。R本人自食惡果不足惜畦戒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望结序。 院中可真熱鬧障斋,春花似錦、人聲如沸徐鹤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽返敬。三九已至遂庄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間劲赠,已是汗流浹背涛目。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工秸谢, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人霹肝。 一個月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓估蹄,卻偏偏與公主長得像,于是被迫代替她去往敵國和親沫换。 傳聞我的和親對象是個殘疾皇子臭蚁,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,543評論 2 349