面試/筆試

一、多態的三個條件

1.要有繼承關係,即有基類和派生類

2.有其中基類有虛函數,派生類有虛函數的重寫

3.父類指針指向子類對象

 

二、new和malloc區別

都是從申請堆上的空間動態內存操作。

1.new是操作符,malloc是庫函數。

2.malloc需要申請指定內存空間大小,new不需要。

3.new返回的是對象類型指針,類型與對象匹配,無需類型轉換;malloc返回的是void型指針,需要通過類型的強制轉換換成所需數據類型。

4.new會自動調用對象的構造函數,delete會調用析構函數;而malloc無法自定類型的構造和析構。

 

 

三、線程是進程的實體,CPU調用和分派的基本單位

進程是資源分配的基本單位

 

四、STL

 

五、static作用

在C中static的作用如下

第一、在修飾變量的時候,static修飾的靜態局部變量只執行一次,而且延長了局部變量的生命週期,直到程序運行結束以後才釋放。 
第二、static修飾全局變量的時候,這個全局變量只能在本文件中訪問,不能在其它文件中訪問,即便是extern外部聲明也不可以。 
第三、static修飾一個函數,則這個函數的只能在本文件中調用,不能被其他文件調用。Static修飾的局部變量存放在全局數據區的靜態變量區。初始化的時候自動初始化爲0; 
(1)不想被釋放的時候,可以使用static修飾。比如修飾函數中存放在棧空間的數組。如果不想讓這個數組在函數調用結束釋放可以使用static修飾 
(2)考慮到數據安全性(當程想要使用全局變量的時候應該先考慮使用static)

還有在C++下的作用。https://www.cnblogs.com/songdanzju/p/7422380.html

 

 

六、全局數據,局部數據,靜態全局數據和靜態局部數據,動態數據的存儲(存儲區域和生命週期)

全局數據和靜態數據存儲在靜態存儲區,局部變量和動態數據存儲在動態存儲區。 

全局變量:從定義到程序結束。

局部變量:其定義的函數內有效

靜態全局變量:定義到程序結束,本文件內有效

靜態局部變量:函數內有效,函數返回不消失 

 

動態存儲區(堆)、動態存儲區(棧)、靜態存儲區、程序代碼區

 

動態存儲區(堆):(動態分配)

malloc動態分配在heap堆區。

動態存儲區(堆),程序員自己分配自己釋放。

 

動態存儲區(棧):(動態分配)

自動變量、const變量在stack棧區。

動態存儲區(棧),系統自動分配釋放。

 

靜態存儲區:(靜態分配)

extern全局變量,在static靜態存儲區。

靜態存儲區,一旦分配,不會被回收,可讀可寫

 

程序代碼區:(靜態分配)

main函數、其他函數在code程序代碼區。

程序代碼區,一旦分配,可讀不可寫,不可改變

堆棧的區別

1、空間分配 

棧是由系統自動分配釋放;堆是有程序員自行申請分配釋放,若程序員不釋放,程序結束時可能由系統來釋放。

2、結構

棧就爲數據結構的棧;堆則類似於數據結構的樹型,通過鏈表存儲。

3、效率

通常棧分配效率比堆快。

 

七、指針

各指針

數組名和普通指針區別

 

八、鏈表

 

九、預處理

宏定義 文件包含 條件編譯

 

十、線程同步方式

臨界區,互斥鎖,信號量,事件對象

 

十一、TCP和UDP的報文內容

序列號 SYN、ACK、FIN 

 

十二、char *str1="hello!" 和 char str2[]="hello!" 的區別

str1是char型指針變量,本身是個變量,可被賦值多次;其存放的是字符串的首地址。

str2是數組名,定義後爲常量指針。賦值時不能拆開賦,需直接後接賦的值。

 

十三、API

背景:  常見的模塊化開發、代碼複用、組件化、動態鏈接庫(DLL)、 軟件框架、分佈式計算以及面向服務的架構(SOA),都隱含了對髙超的API設計技能的需求。

目標:  健壯而優雅、穩定而耐用、抽象而隱藏,最主要的: 變更管理----應對變化、新需求、功能要求及錯誤修復。

API的一個重要的基本定義是:API是一個明確定義的軟件組件的邏輯接口, 可以爲其他軟件提供特定服務,可大可小,可互相依賴,隱藏了內部實現細節。API是爲其所提供的服務或者行爲定義的一個契約。

       C++API通常會包含如下的元素:
           (1)頭文件:一組.h頭文件
           (2)一個或多個靜態庫或動態庫文件
           (3)文檔

        Win32 API是純C API,而非C++API。可以在C++程序中直接使用C API, C++API中的傑出代表是STL( Standard Template Library,標準模板庫)。STL包含了一組容器類、對容器中元素進行遍歷的迭代器以及作用於容器的各種算法。例如,該算法集合中包括很多高級操作,比如std::search()、std::reverse()、std::sort()和std::set_intersection()。因此,STL 提供的是操作元素集合任務的邏輯接口,且沒有暴露每個算法內部的實現細節。


原文:https://blog.csdn.net/j_s_3721/article/details/70175105?utm_source=copy 

 

十四、RTP (TCP UDP)

1.1.  RTP是什麼

RTP全名是Real-time Transport Protocol(實時傳輸協議)。它是IETF提出的一個標準,對應的RFC文檔爲RFC3550(RFC1889爲其過期版本)。RFC3550不僅定義了RTP,而且定義了配套的相關協議RTCP(Real-time Transport Control Protocol,即實時傳輸控制協議)。RTP用來爲IP網上的語音、圖像、傳真等多種需要實時傳輸的多媒體數據提供端到端的實時傳輸服務。RTP爲Internet上端到端的實時傳輸提供時間信息和流同步,但並不保證服務質量,服務質量由RTCP來提供。

1.2.  RTP的應用環境 

RTP用於在單播或多播網絡中傳送實時數據。它們典型的應用場合有如下幾個。

(1)簡單的多播音頻會議。語音通信通過一個多播地址和一對端口來實現。一個用於音頻數據(RTP),另一個用於控制包(RTCP)。

(2)音頻和視頻會議。如果在一次會議中同時使用了音頻和視頻會議,這兩種媒體將分別在不同的RTP會話中傳送,每一個會話使用不同的傳輸地址(IP地址+端口)。如果一個用戶同時使用了兩個會話,則每個會話對應的RTCP包都使用規範化名字CNAME(Canonical Name)。與會者可以根據RTCP包中的CNAME來獲取相關聯的音頻和視頻,然後根據RTCP包中的計時信息(Network time protocol)來實現音頻和視頻的同步。

(3)翻譯器和混合器。翻譯器和混合器都是RTP級的中繼系統。翻譯器用在通過IP多播不能直接到達的用戶區,例如發送者和接收者之間存在防火牆。當與會者能接收的音頻編碼格式不一樣,比如有一個與會者通過一條低速鏈路接入到高速會議,這時就要使用混合器。在進入音頻數據格式需要變化的網絡前,混合器將來自一個源或多個源的音頻包進行重構,並把重構後的多個音頻合併,採用另一種音頻編碼進行編碼後,再轉發這個新的RTP包。從一個混合器出來的所有數據包要用混合器作爲它們的同步源(SSRC,見RTP的封裝)來識別,可以通過貢獻源列表(CSRC表,見RTP的封裝)可以確認談話者。

 

十五、ifndef和extern “C”

C++語言支持函數重載,C語言不支持函數重載。函數被C++編譯器編譯後在庫中的名字與C語言的不同。假設某個函數的原型爲: void foo(int x, int y); 該函數被C編譯器編譯後在庫中的名字爲_foo,而C++編譯器則會產生像_foo_int_int之類的名字。C++提供了C連接交換指定符號extern“C”來解決名字匹配問題。

 

十六、位域

有些信息在存儲時,並不需要佔用一個完整的字節, 而只需佔幾個或一個二進制位。例如在存放一個開關量時,只有0和1 兩種狀態, 用一位二進位即可。爲了節省存儲空間,並使處理簡便,C語言又提供了一種數據結構,稱爲“位域”或“位段”。所謂“位域”是把一個字節中的二進位劃分爲幾 個不同的區域,並說明每個區域的位數。每個域有一個域名,允許在程序中按域名進行操作。 這樣就可以把幾個不同的對象用一個字節的二進制位域來表示。位段成員必須聲明爲int、unsigned int或signed int類型(short char long)。

1. 如果一個字節所剩空間不夠存放另一位域時,應從下一單元起存放該位域。

2.位域的長度不能大於數據類型本身的長度,比如int類型就能超過32位二進位。

3. 位域可以無位域名,這時它只用來作填充或調整位置。無名的位域是不能使用的。

 

struct foo2 {
char    a : 2;
char    b : 3;
char    c : 1;
};

struct foo3 {
char    a : 2;
char    b : 3;
char    c : 7;
};

sizeof(struct foo2) = 1
sizeof(struct foo3) = 2

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章