Qt面試題包含函數(shù)指針
Qt 面試題包含函數(shù)指針的一篇文章與大家,在你面試的時候,一定能用的到。那么快參考以下本文吧。
面試官問的問題是:Qt信號槽機制,你覺得可以用什么策略來取代? 因為signal-slot本身是一個順序執(zhí)行的過程,只有執(zhí)行完slot之后,才會執(zhí)行emit的下一條語句。其策略類似于函數(shù)調(diào)用,只不過由于其在QObject中架設(shè)了一個大的結(jié)構(gòu),這導(dǎo)致其執(zhí)行效率不是很高,比直接的函數(shù)調(diào)用要慢10倍(忘記拿看的數(shù)據(jù)了)。平時在做項目時:如果可以我一般是用寫純虛接口的方式來替代signal-slot。
面試官又問:你有沒有想過用函數(shù)指針來替代? 汗一個先,以前真沒想過,而且函數(shù)指針用的也很少,今天專門補了一下這方面的知識,如下:
一:關(guān)于函數(shù)指針。
這個要區(qū)分于指針函數(shù)。
(1)一個程序分為代碼區(qū)和數(shù)據(jù)區(qū),那么一個指針既可以指向在內(nèi)存中存放數(shù)據(jù)的數(shù)據(jù)區(qū),也可以指向存放代碼的代碼區(qū)。代碼區(qū)中存放的就是各個函數(shù)。由此可見:我們可以用一個指針來指向某個函數(shù)。
(2)在c語言中規(guī)定:一個函數(shù)總是占有一段連續(xù)的內(nèi)存區(qū),而函數(shù)名就是該函數(shù)所占內(nèi)存區(qū)的首地址。 我們可以將該函數(shù)所占的這塊內(nèi)存區(qū)的首地址賦給一個指針變量,使該指針變量指向這個函數(shù)! 而后我們就可以使用這個指針變量來找到和調(diào)用該函數(shù)。
這種指向函數(shù)的指針變量就是“函數(shù)指針”
函數(shù)指針的一般定義形式是:
函數(shù)返回值類型 (*函數(shù)指針名)(函數(shù)形參列表)
例如:int (*pmax)(int,int); 這定義了一個指向含2個int形參,返回int值的函數(shù)指針。
比如:函數(shù) int max(int a,int b)
我們可以這樣調(diào):
- int as = max(a,b); //這是用函數(shù)名調(diào)
我們也可這樣調(diào):
- int(*pmax)(int,int);//使用函數(shù)指針來調(diào)用
- pmax = max;
- int as = (*pmax)(a,b);
注意事項:函數(shù)指針是指向函數(shù)的指針變量,它只能指向函數(shù)的入口處,而不能指向函數(shù)中間的某一條指令! 所以不能用*(pmax+1)這樣的方式來執(zhí)行函數(shù)的下一條指令。
二:signal-slot如何用函數(shù)指針來替代:
知道函數(shù)指針是怎么回事后,我們就可以來思考這個問題了。
其本質(zhì)還是如何使用函數(shù)指針來實現(xiàn)函數(shù)調(diào)用,那明擺著就是需要把函數(shù)指針都存放起來,而后當調(diào)用的時候直接去這個存放處查找即可!我理解面試官的意思是這樣的:
(1)原本在一個類中定義一些slot,我們可以如下替代他們:首先定義一些普通的成員函數(shù)(原本他們應(yīng)該是slot),而后另外再建一個void函數(shù)指針數(shù)組:將原本用作slot的函數(shù)的函數(shù)指針全部存進來。 這樣:對于一個類而言:我們就是用一個函數(shù)指針數(shù)組來取代了slot。(同時用這個數(shù)組來區(qū)分一般的成員函數(shù) 和 類槽函數(shù))。
(2)對于connect()函數(shù)和signal,我沒想出什么好辦法,貌似只能用observer接口。直接去調(diào)函數(shù)指針數(shù)組中的對應(yīng)函數(shù)。
我覺得關(guān)鍵在于:含有槽的類中:如果用函數(shù)指針來做的話,可以將原本的各個slot函數(shù)直接聲明為private成員函數(shù),而將這個數(shù)組對外開放為public,這樣封裝一下的比較好,也能體現(xiàn)其區(qū)分優(yōu)勢。
小結(jié):Qt 面試題包含函數(shù)指針的內(nèi)容介紹完了,不知道有沒有幫助到你,
【編輯推薦】