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