C++音視頻開發(fā) 面試1
技能要求:Socket,MFC,Windows
崗位職責(zé):
1、參與需求分析、模塊開發(fā)等相關(guān)工作;
2、在windows平臺下進行C/C++應(yīng)用程序設(shè)計、開發(fā)、測試;
3、參與軟件系統(tǒng)或模塊的聯(lián)調(diào),協(xié)助測試人員進行軟件測試,修復(fù)BUG;
4、參與編寫相關(guān)技術(shù)文檔。
任職要求:
(1)統(tǒng)招本科及以上畢業(yè),計算機相關(guān)專業(yè)畢業(yè),3年以上C++研發(fā)工作經(jīng)驗;
(2)熟悉Windows操作系統(tǒng),精通C/C++、面向?qū)ο筌浖O(shè)計,熟悉多線程控制及MFC界面編程等;
(3)有大型C/C++服務(wù)器研發(fā)經(jīng)驗優(yōu)先,熟悉TCP/IP協(xié)議;
(4)具備通信基礎(chǔ)知識、有音視頻系統(tǒng)相關(guān)開發(fā)經(jīng)驗優(yōu)先;
(5)具有良好的編程習(xí)慣,積極溝通反饋,善于團隊協(xié)作。
C++ 筆試題
1、MFC指的什么?
2、SendMessage和PostMessage區(qū)別?
3、MFC的對話框的種類,各自怎么使用?及相關(guān)函數(shù)
4、自定義一個Windows消息的發(fā)送與響應(yīng),有哪些步驟?
5、在MFC窗口中制作一個逃跑按鈕(鼠標(biāo)永遠(yuǎn)捕捉不到),該如何實現(xiàn)?
6、MFC中文檔視圖結(jié)構(gòu)中都需要哪些類?
7、音頻信號壓縮標(biāo)準(zhǔn)的編碼主要有哪些?
aac MP3 ape flac
8、經(jīng)采樣、編碼但未壓縮的語音信號(對應(yīng)G.711編碼)是什么數(shù)據(jù)?
9、常見的數(shù)字音頻編碼文件格式有哪些,并簡述其特點。
10、如何從H264碼流中獲取視頻的分辨率大小?
11、H264碼流中I幀,P幀,B幀的區(qū)別是什么?
12、回答下面的問題。
(1)、引用與指針的區(qū)別是什么?
(2)、構(gòu)造函數(shù)和析構(gòu)函數(shù)是否可以被重載,為什么?
13、以下為 WindowsNT下的32位C++程序,請計算 sizeof的值
vold Func( char str[1001)
SIzeof( str)=?
dkp= malloc( 100)
sizeof( p)=?
14、編寫 strcat函數(shù)
已知 strcat函數(shù)的原型是char* strcat(char* strDest,const char* strSrc)
其中 strDest是目的字符串, strss是源字符串。
不調(diào)用C++/C的字符串庫函數(shù),請編寫函數(shù) strcat
15、寫一個函數(shù)找出一個整數(shù)數(shù)組中,第二大的數(shù)。
面試
1、對MFC熟悉么?寫過復(fù)雜的界面沒有?還有文檔視圖使用的多不?
2、使用過哪些VC++中的線程同步?
3、VC++中網(wǎng)絡(luò)模型熟悉不?比如說完成端口、重疊IO
C++ 技術(shù)面試2
1、模板的主要用途和實現(xiàn)機理是什么?
2、STL vector是怎么實現(xiàn)的,內(nèi)部原理是什么?
3、你覺得你是一個什么樣的人?
(1)、對技術(shù)鉆研比較深入,不太在于工資,對技術(shù)很狂熱。
(2)、做工資就是看工資,不在乎使用什么技術(shù),只要賺錢就行。
4、你的未來職業(yè)規(guī)劃是什么?
5、Modbus協(xié)議的原理和內(nèi)部機制、分類等
6、TCP和UDP的區(qū)別?
7、Boost庫熟悉哪些?
8、C++11熟悉么?
auto、lambda表達式,
右值引用熟悉么?完美轉(zhuǎn)發(fā)熟悉么?
9、STL標(biāo)準(zhǔn)庫熟悉么?熟悉哪些容器和算法?
10、多線程熟悉么?多線程一般需要注意哪些問題?你使用到哪些鎖?mutex、讀寫鎖,unique_lock用過沒?
11、進程間通信使用過哪一些?
信號量、共享內(nèi)存、油槽
12、對QT、MFC熟悉么?
C++面試3
1、WebSocket和Socket有什么區(qū)別?
2、對高并發(fā)熟悉么?你們做的TCP Server并發(fā)量高么?
3、你最近的一份工作中遇到的一個難點和問題是什么?你是怎么解決的?
4、你在你們項目中負(fù)責(zé)什么?擔(dān)任什么角色?
5、Boost庫中為什么大量使用hpp文件?基于什么考慮?
Boost庫的頭文件與我們平常所用的頭文件(*.h)或者C++標(biāo)準(zhǔn)庫頭文件(沒有后綴名)不同,它是把C++類的聲明和實現(xiàn)放在了一個叫做.hpp文件中。之所以這么做,一是與普通C頭文件區(qū)分開,還有一個重要的原因是使Boost庫不需要預(yù)先編譯,可以直接引入程序員的工程即可編譯鏈接,方便庫的使用。最后有一個原因就是C++編譯器的限制,許多編譯器還不支持C++標(biāo)準(zhǔn)提出的模板分離編譯模式(export關(guān)鍵字),而Boost庫大量使用了模板,為了保持與各個編譯器的兼容,也不得不采用這種.hpp的頭文件形式。
6、模板的實現(xiàn)可以寫在.h文件中嗎?
7、C++模板類代碼只能寫在頭文件?
這個問題,實際上我?guī)啄昵熬陀龅搅?。最近寫個模板類玩的時候,再次遇到。
當(dāng)我非常仔細(xì)的將定義和實現(xiàn)分開,在頭文件中保留了最少的依賴后,一切就緒.cpp單獨編過。但是當(dāng)使用的時候,就會報告所有的函數(shù)調(diào)用都沒有實現(xiàn)。按常規(guī).h/.cpp而言這是不可能的。但是模板類就是這么獨特。簡單說說他的原因,也備自己將來遺忘:
從語法角度而言,是沒有強制要求說模板代碼的聲明和實現(xiàn)不可以分開。那么當(dāng)分離的聲明和實現(xiàn)寫好后,單獨編譯.cpp是可以通過的,但是生成的.o文件卻非常小,只有一個原因:確實沒有任何實現(xiàn)代碼!————不知道用什么類型參數(shù)套用模板。
因為模板類需要在使用到的地方利用聲明模板的typename或者class參數(shù)的時候,才會即時生成代碼。那么當(dāng)我把模板聲明和實現(xiàn)分開的時候,這個即時過程因為編譯器只能通過代碼include“看到”頭文件而找不到模板實現(xiàn)代碼,所以會產(chǎn)生鏈接問題。這也是為什么幾乎都會建議模板類和聲明和實現(xiàn)都寫在頭文件。
如果剛接觸c/c++編寫的朋友可能還不是很明白。編譯器面對巨量代碼的時候,也是以一個一個的.cpp/.c文件作為基本單元,根據(jù)代碼的include包含找到聲明,翻譯代碼產(chǎn)生.o文件。注意他們每個cpp/c文件都是相互獨立完成自己工作的,對于缺少的部分,如果妥善聲明,會留待鏈接過程的時候產(chǎn)生引用關(guān)系。 那么剛才說的模板類實現(xiàn)代碼,編譯它的時候因為不知道套用什么參數(shù),實際上沒有任何有用的內(nèi)容存在于.o文件當(dāng)中。而在使用模板類的地方指定了類型參數(shù),編譯器這才開始根據(jù)模板代碼產(chǎn)生有用的.o編碼,可是這些內(nèi)容放在了使用模板的代碼產(chǎn)生的.o文件當(dāng)中。如果編使用模板代碼的時候,通過include包含“看不到”模板的實現(xiàn)代碼,這些所有的缺失,到鏈接階段就無法完成。
所以最后的結(jié)論是:請老老實實把模板的實現(xiàn)和聲明都寫在頭文件吧。如果你很有想法有個性,可以堅持,然后試試#include “xxxx.cpp” 這樣屌炸的代碼。
Qt C++面試4
1、談?wù)凲t的信號-槽的實現(xiàn)機理
信號-槽是一種對象之間的通信機制,是Qt在標(biāo)準(zhǔn)C++之外,使用元對象編譯器(MOC)實現(xiàn)的語法糖
2、對23種常見的設(shè)計模式熟悉哪些?
觀察者模式、單例模式、工廠模式、狀態(tài)模式
3、Boost庫中的Singal2信號-槽和Qt中的信號-槽有什么區(qū)別?
4、Qt中多線程中槽函數(shù)是怎么調(diào)用的,調(diào)用的時機是什么?
Qt中 QThread 實現(xiàn)線程有幾種方式?
5、在信號-槽中是怎么傳遞自定義結(jié)構(gòu)體的?
QT信號槽收發(fā)自定義類/自定義結(jié)構(gòu)體的2種方法
想要發(fā)射信號時,攜帶自定義的class或者struct,必須要做一下處理,否則編譯時不會報錯,但運行時會出錯。
假設(shè)我們自定義了一個結(jié)構(gòu)體:
typedef struct
{
...//
...//
}Frame7E;
如果想要這么用:
Frame7E frame;
...//填充frame
emit sendFrame(frame);
那么必須使用以下兩種方法之一。
方法1:使用宏:Q_DECLARE_METATYPE
該方法的原理是使得QVariant類支持我們自定義的類型,而QT的信號槽是支持發(fā)射QVariant類型數(shù)據(jù)的,然后我們可以用QVariant封裝這個自定義類/結(jié)構(gòu),然后emit 出去QVariant類型的變量。
include <qmetatype.h>
//發(fā)射端
Frame7E frame;
...//填充frame
QVariant var;
var.setValue(frame); // copy s into the variant
emit sendFrame(var);//發(fā)QVariant類型的信號
接收端
// retrieve the value
Frame7E s2 = var.value<Frame7E>();//QVariant 轉(zhuǎn)換為 Frame7E
方法2:使用qRegisterMetaType函數(shù)使得QT的信號槽支持自定義類型
參考:https://blog.csdn.net/xbnlkdbxl/article/details/56842565
include <QMetaType>
//注冊自定義類型,使QT的信號槽支持我們的類型
qRegisterMetaType<Frame7E>("Frame7E");//參數(shù)無所謂,建議帶上同名字符串參數(shù)
注冊完之后,就可以正常使用信號槽了。
需要注意以下幾點:
1、注冊位置:在第一次使用此類鏈接跨線程的signal/slot之前,一般在當(dāng)前類的構(gòu)造函數(shù)中進行注冊;
2、注冊方法:在當(dāng)前類的頂部包含:#include <QMetaType>,構(gòu)造函數(shù)中加入代碼:qRegisterMetaType<MyClass>("Myclass");
3、Myclass的引用類型需單獨注冊:qRegisterMetaType<MyClass>("Myclass&");
8、Windows進程間通信的方式有哪些?
9、WebSocket和Socket有什么區(qū)別?
10、談?wù)凲t的DBus
C++面試5
1、STL vector做大量push_back操作時會出現(xiàn)什么問題?
2、boost庫 指針的原理,怎么做到動態(tài)分配內(nèi)存不delete?
3、模板你在項目中使用的多嗎?
C++面試6
1、派生類怎么調(diào)用基類的虛函數(shù)版本?
C++ primer 這本書上有這么兩句話“派生類虛函數(shù)調(diào)用基類版本時,必須顯式使用作用域操作符。如果派生類函數(shù)忽略了這樣做,則函數(shù)調(diào)用會在運行時確定并且將是一個自身調(diào)用,從而導(dǎo)致無窮遞歸。”
也就是說:
當(dāng)你實現(xiàn)派生類B的虛函數(shù)B::foo()時,如果函數(shù)體內(nèi)需要調(diào)用基類的虛函數(shù)版本時,需要顯示使用基類A的作用域操作符A::foo(),否則foo()就會在派生類作用域調(diào)用派生類版本的虛函數(shù),這樣會導(dǎo)致無窮遞歸。
就是自己在調(diào)用自己,沒有指明調(diào)用的是基類的虛函數(shù),自動認(rèn)為是調(diào)用派生類的虛函數(shù),然后就再次調(diào)用了,一直進行下去了。
struct A
{
virtual void foo(void) { }
}
struct B: public A
{
void foo(void)
{
foo(); // 遞歸調(diào)用自己,即 B::foo()
A::foo(); // 明確告訴編譯器,調(diào)用的是 A::foo(), 而不是自己
}
}
2、STL map:erase刪除元素之后迭代器失效的問題
當(dāng)刪除map迭代器中的某個元素時,會出現(xiàn)迭代器失效,該如何安全的解決處理?
3、智能指針了解么?
shared_ptr、unique_ptr、weak_ptr、scope_ptr有什么區(qū)別
4、面向?qū)ο螅禾摵瘮?shù)和純虛函數(shù)有什么區(qū)別?
5、如何保證訪問STL容器比如vector、map、set線程安全?讀寫前后加鎖處理
6、單例模式
指針: 會出現(xiàn)多線程訪問的new多個對象的問題
static 成員變量:所有類都使用同一個對象
7、你目前這份工作解決的最大難題是什么,談?wù)勀闶窃趺唇鉀Q的?
C++面試7
1、二級指針 指針的指針一般用來做什么?
2、動態(tài)數(shù)組使用C語言怎么實現(xiàn)?
3、對Linux熟悉嗎,比如常見的命令、發(fā)行版?chmod命令是用來干什么的?
4、進程和線程有什么區(qū)別?線程間的數(shù)據(jù)可以共享么?
5、TCP和UDP的有什么區(qū)別?
TCP服務(wù)端、客戶端的實現(xiàn)流程一般是什么樣的?
UDP需要建立連接么?
6、信號量一般怎么使用,熟悉么?
7、C語言或者C++中static關(guān)鍵字的作用?
1. 修飾普通變量,修改變量的存儲區(qū)域和生命周期,使變量存儲在靜態(tài)區(qū),在 main 函數(shù)運行前就分配了空間,如果有初始值就用初始值初始化它,如果沒有初始值系統(tǒng)用默認(rèn)值初始化它。
2. 修飾普通函數(shù),表明函數(shù)的作用范圍,僅在定義該函數(shù)的文件內(nèi)才能使用。在多人開發(fā)項目時,為了防止與他人命名空間里的函數(shù)重名,可以將函數(shù)定位為 static。
3. 修飾成員變量,修飾成員變量使所有的對象只保存一個該變量,而且不需要生成對象就可以訪問該成員。
4. 修飾成員函數(shù),修飾成員函數(shù)使得不需要生成對象就可以訪問該函數(shù),但是在 static 函數(shù)內(nèi)不能訪問非靜態(tài)成員。
8、protobuf協(xié)議有使用過么?
9、xml熟悉么?xpath是什么?
10、怎么讓一個類只有一個唯一對象?