東軟面試
C語言與C++語言的區別
C++ 和 C 語言在語法、面向對象特性、內存管理和應用場景等方面存在著明顯的差異。 C 語言適合底層開發和對性能要求苛刻的場景,而 C++ 在 C 語言的基礎上增加了面向對象等強大的特性,更適合大型項目和復雜系統的開發。C++ 是面向對象的,具有豐富的面向對象特性和標準庫,但語法較復雜;C 語言是面向過程的,具有簡單直觀的語法和較高的性能,但缺乏面向對象特性和豐富的標準庫。
C++之中子類和父類的構造和析構函數的調用順序
父類在前子類在后,即先調用父類的構造函數,再調用子類的構造函數。 父類和子類 析構函數 的調用順序:子類在前父類在后,即先調用子類的析構函數,再調用父類的析構函數。 對于不存在多態的繼承,一定要用子類的指針來刪除子類,否則會導致子類無法被完全析構。 對于存在多態的繼承, 一定要將父類的析構函數聲明成virtual,否則會導致子類無法被完全析構。
C++之中線程和多線程之中的調用
C++ 提供了強大的多線程支持,特別是在 C11 標準及其之后,通過 標準庫使得多線程編程變得更加簡單和安全。核心組件包括: stdmutex:用于線程之間的互斥,防止多個線程同時訪問共享資源。C11 新標準中引入了5個頭文件來支持多線程編程,如下圖所示: 使用多進程并發是將一個應用程序劃分為多個獨立的進程(每個進程只有一個線程),這些獨立的進程間可以互相通信,共同完成任務。
C++之中容器Vector的作用。
C++中vector的擴容策略和原理是通過重新分配內存來實現的。當vector中的元素數量超過當前的容量時,vector會分配一個更大的內存塊,并將原來的元素復制到新的內存中。通常,新的容量會比原來的容量大一些,以便減少頻繁的擴容操作。不同的編譯器可能采用不同的擴容倍數,如GCC是二倍擴容,VS13是1.5倍擴容。擴容后,原來的內存會被釋放,原來的迭代器會失效。
C++之中虛函數和純虛函數的定義和區別。
一、虛函數
虛函數是指在C++中,被virtual關鍵字修飾的成員函數。當調用此類函數時,編譯器會根據調用對象的實際類型,而不是根據聲明類型來調用適當的函數。這種機制使得虛函數能夠實現多態性,即相同的函數名在不同的對象上可以表現出不同的行為。
虛函數可以在類中聲明,也可以在類的外部聲明。編譯器會自動將它們轉換為虛函數,并在類對象中插入一個指向虛函數表的指針。虛函數表保存了類中所有虛函數的地址,通過虛表指針可以找到對應的函數地址,從而實現動態綁定。
虛函數可以有實現,也可以沒有實現。在子類中,虛函數可以被覆蓋,也可以不被覆蓋。如果子類沒有覆蓋基類的虛函數,那么當通過基類指針或引用調用該函數時,將調用基類的虛函數實現。
二、純虛函數
純虛函數是一種特殊的虛函數,它在聲明時除了加上virtual關鍵字外,還需要加上=0。純虛函數沒有函數體,只提供函數聲明,而不提供實際實現。由于編譯器不能確定如何實現純虛函數,因此需要在子類中實現它。
純虛函數只能在類中聲明,而不能在類的外部聲明。由于純虛函數沒有實現,因此它所在的類被稱為抽象類。抽象類不能實例化對象,只能作為基類為派生類服務。派生類必須實現基類中所有的純虛函數,否則派生類也將成為抽象類,不能實例化對象。
三、虛函數與純虛函數的區別
定義方式:虛函數在定義時在普通函數的基礎上加上virtual關鍵字,而純虛函數在定義時除了加上virtual關鍵字外,還需要加上=0。
實現方式:虛函數可以有實現,也可以沒有實現;而純虛函數沒有實現,必須在子類中實現。
使用方式:虛函數可以直接使用,而純虛函數必須在派生類中實現后才能使用。
多態性:虛函數和純虛函數都可以實現多態性,但純虛函數更多地用于定義抽象接口,而虛函數則用于實現具體的多態行為。
類類型:包含虛函數的類可以是普通類,也可以是抽象類;而包含純虛函數的類一定是抽象類。
C++之中進程間通信的方式。
管道(匿名和命名)、共享內存、消息隊列和信號量
C++中實現進程間通信的幾種常見方法包括管道(匿名和命名)、共享內存、消息隊列和信號量。每個方法都附帶了示例代碼,展示了如何在父子進程中進行數據傳輸。這些通信方式各有特點,如管道的半雙工特性,共享內存的高效性,消息隊列的可靠性以及信號量的同步控制功能。
浙公網安備 33010602011771號