金山WPS面试题
1.windows的handle
1)是一個(gè)宏定義#define void* HANDLE
2) HANDLE提供了一種統(tǒng)一的方式去獲得系統(tǒng)資源,并對(duì)其進(jìn)行操作。
3) HANDLE使得程序設(shè)計(jì)的細(xì)節(jié)得以被隱藏,從而能夠更加方便地對(duì)細(xì)節(jié)的實(shí)現(xiàn)進(jìn)行修改。
4) 由于不知道HANDLE所指向的具體的數(shù)據(jù)結(jié)構(gòu),所以我們必須根據(jù)源碼提供者的API使用HANDLE,而且不同種類(lèi)的HANDLE是無(wú)法混用的。例如:GetModuleHandle返回的HANDLE和GetFileHandle返回的HANDLE是不同的,只能在他們對(duì)應(yīng)的函數(shù)中使用。
5)HANDLE(句柄)是Windows操作系統(tǒng)中的一個(gè)概念。在Windows程序中,有各種各樣的資源(窗口、圖標(biāo)、光標(biāo)等),系統(tǒng)在創(chuàng)建這些資源時(shí)會(huì)為它們分配內(nèi)存,并返回標(biāo)示這些資源的標(biāo)示號(hào),即句柄
無(wú)效的返回值為: INVALID_HANDLE_VALUE
編程時(shí)可作調(diào)試用:
例如:
#include<iostream>
#include<windows.h>
using namespace std;
int main(void)
{
char ch[20] = "Test.dsw";
HANDLE handle;
LPWIN32_FIND_DATA fd;
handle = FindFirstFile(ch,fd);
if(handle != INVALID_HANDLE_VALUE)
cout<<"ok"<<endl;
else
cout<<"no"<<endl;
return 0;
}
2.windows的文件handle和linux的文件系統(tǒng)
同1
3.QT的connect連接的幾種方式
?//1.Qt::DirectConnection 直接連接,當(dāng)發(fā)送者和接收者在同一個(gè)線(xiàn)程的時(shí)候
?//2.Qt::QueuedConnection 隊(duì)列的形式連接,當(dāng)發(fā)送者和接收者不在同一個(gè)線(xiàn)程的時(shí)候
?//3.Qt::BlockingQueuedConnection?發(fā)送完信號(hào)后發(fā)送者所在線(xiàn)程會(huì)阻塞,直到槽函數(shù)運(yùn)行完。接收者和發(fā)送者絕對(duì)不能在一個(gè)線(xiàn)程,否則程序會(huì)死鎖。在多線(xiàn)程間需要同步的場(chǎng)合可能需要這個(gè)。
?//4.Qt::AutoConnection?默認(rèn)值,使用這個(gè)值則連接類(lèi)型會(huì)在信號(hào)發(fā)送時(shí)決定。如果接收者和發(fā)送者在同一個(gè)線(xiàn)程,則自動(dòng)使用Qt::DirectConnection類(lèi)型。如果接收者和發(fā)送者不在一個(gè)線(xiàn)程,則自動(dòng)使用Qt::QueuedConnection類(lèi)型。
?//5.Qt::UniqueConnection 這個(gè)flag可以通過(guò)按位或(|)與以上四個(gè)結(jié)合在一起使用。當(dāng)這個(gè)flag設(shè)置時(shí),當(dāng)某個(gè)信號(hào)和槽已經(jīng)連接時(shí),再進(jìn)行重復(fù)的連接就會(huì)失敗。也就是避免了重復(fù)連接。
4.sizeHint的用途和場(chǎng)景
1)widget->sizeHint().width(); 當(dāng)widget沒(méi)有setLayout(layout)設(shè)置布局的時(shí)候sizeHint是valid不合法的,當(dāng)設(shè)置了布局的時(shí)候返回layout的首選尺寸;
setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
5.map和hashmap
https://www.cnblogs.com/chengxiao/p/6059914.html?hashmap以及數(shù)組操作的時(shí)間復(fù)雜度;
1)map時(shí)間復(fù)雜度 log(n)
2)hashmap時(shí)間復(fù)雜度o(1)
3)hashmap犧牲空間來(lái)節(jié)省時(shí)間,數(shù)據(jù)量比較大的情況下采用能夠更好地提升效率
6.QT QObject的線(xiàn)程相關(guān)性
?1)內(nèi)部會(huì)記錄當(dāng)前線(xiàn)程的id,通過(guò)對(duì)比發(fā)送信號(hào)的線(xiàn)程id和接受信號(hào)的線(xiàn)程id是否在同一個(gè)線(xiàn)程內(nèi)決定采用哪種連接方式;
?https://www.baidu.com/link?url=_XBDxthZ8CSty3ZZwSAMMDb1_jRhSvbHTFomO7S_3UjqHo7aojCfFkCcje7Yy8-_&wd=&eqid=ee05ef8200014964000000065c344d27
https://blog.csdn.net/LynFam/article/details/7081545
7.Https的幾種返回碼
https://i.cnblogs.com/EditPosts.aspx?postid=10188381
8.json和protoful的區(qū)別
Protocol Buffers 是一種輕便高效的結(jié)構(gòu)化數(shù)據(jù)存儲(chǔ)格式,可以用于結(jié)構(gòu)化數(shù)據(jù)串行化,或者說(shuō)序列化。它很適合做數(shù)據(jù)存儲(chǔ)或 RPC 數(shù)據(jù)交換格式。可用于通訊協(xié)議、數(shù)據(jù)存儲(chǔ)等領(lǐng)域的語(yǔ)言無(wú)關(guān)、平臺(tái)無(wú)關(guān)、可擴(kuò)展的序列化結(jié)構(gòu)數(shù)據(jù)格式。
9.map遍歷的時(shí)間復(fù)雜度
1)map時(shí)間復(fù)雜度 log(n)
2)hashmap時(shí)間復(fù)雜度o(1)
10.list插入的時(shí)間復(fù)雜度
?list插入的時(shí)間復(fù)雜度為o(1) 常量;不支持隨機(jī)訪(fǎng)問(wèn);
1)vector
內(nèi)部數(shù)據(jù)結(jié)構(gòu):數(shù)組。
在末尾增加或者刪除元素所需時(shí)間與元素?cái)?shù)目無(wú)關(guān),在中間或者開(kāi)頭增加或者刪除元素所需時(shí)間是隨元素?cái)?shù)目呈線(xiàn)性變化。
2)deque
內(nèi)部數(shù)據(jù)結(jié)構(gòu)是:數(shù)組
隨機(jī)訪(fǎng)問(wèn)每個(gè)元素,所需要的時(shí)間為常量。在開(kāi)頭和末尾增加元素所需時(shí)間與元素?cái)?shù)目無(wú)關(guān),在中間增加或刪除所需時(shí)間隨元素?cái)?shù)目呈線(xiàn)性變化。
3)list
內(nèi)部數(shù)據(jù)結(jié)構(gòu):雙向環(huán)狀鏈表
不能隨機(jī)訪(fǎng)問(wèn)一個(gè)元素,可雙向遍歷,在開(kāi)頭,末尾和中間的任何地方增加或者刪除元素所需時(shí)間都是常量。
4)set
鍵和值相等。
鍵唯一
元素默認(rèn)按升序排列、
5)map
鍵唯一,
元素默認(rèn)按鍵的升序排列
11.迭代器和指針的區(qū)別
?1)迭代器是指針的抽象,每一種容器都有自己對(duì)應(yīng)的迭代器。
2)迭代器是具有指針行為也就是重載了->指針操作符的class template
12.c++11的新特性 Lambada的傳值的幾種方式
?總結(jié)幾個(gè)要點(diǎn)
?1)[]()-> type{} 或者 [](){}兩種形式都可以(即省略返回值類(lèi)型),但是賦值給的函數(shù)指針的返回值類(lèi)型要一致;
?2)?
[] //未定義變量.試圖在Lambda內(nèi)使用任何外部變量都是錯(cuò)誤的. [x, &y] //x 按值捕獲, y 按引用捕獲. [&] //用到的任何外部變量都隱式按引用捕獲 [=] //用到的任何外部變量都隱式按值捕獲 [&, x] //x顯式地按值捕獲. 其它變量按引用捕獲 [=, &z] //z按引用捕獲. 其它變量按值捕獲外部變量的捕獲必須用這幾種形式;
?3)如果lambda表達(dá)式捕獲了引用傳遞,不能作為函數(shù)參數(shù)傳入;
?4)可以定義auto或者對(duì)應(yīng)的函數(shù)指針類(lèi)型的變量來(lái)接收l(shuí)ambda表達(dá)式,然后調(diào)用;
?5)lambda即使是無(wú)參的也不能直接執(zhí)行,必須通過(guò)函數(shù)指針或者auto類(lèi)型的變量來(lái)調(diào)用執(zhí)行;
13.QML中C++和QML如何交互和傳值
14.QEventLoop
15.內(nèi)存回收機(jī)制
16.c++的類(lèi)型轉(zhuǎn)換
- static_cast: 1)完成基礎(chǔ)數(shù)據(jù)類(lèi)型,2)同一個(gè)繼承體系中類(lèi)型的轉(zhuǎn)換 3)任意類(lèi)型與空指針類(lèi)型void*之間的轉(zhuǎn)換。
- dynamic_cast:使用多態(tài)的場(chǎng)景,增加了一層對(duì)真實(shí)調(diào)用對(duì)象類(lèi)型的檢查
- reinterpret_cast:個(gè)關(guān)鍵詞在我們需要把類(lèi)型映射回原有類(lèi)型時(shí)用到它。我們映射到的類(lèi)型僅僅是為了故弄\
玄虛和其他目的,這是所有映射中最危險(xiǎn)的。 - const_cast:去掉常屬性,只有轉(zhuǎn)換的當(dāng)時(shí)有效,之后變量恢復(fù)常屬性;
17.迭代器什么時(shí)候會(huì)失效
include "stdafx.h"
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int> vect;
for(int i = 0; i < 10; i++ )
{
vect.push_back(i);
}
vector<int>::iterator iter = vect.begin();
for(; iter != vect.end(); iter++ )
{
if( *iter % 2 == 0 )
{
vect.erase(iter);
}
}
return 0;
}
iter是指向vector這個(gè)容器中的某個(gè)元素,如果不是在for、while循環(huán)中,erase刪除元素是沒(méi)有問(wèn)題的,但是如果在for、while循環(huán)中對(duì)容器迭代,刪除其中符合條件的所有元素,就可能出現(xiàn)問(wèn)題。vect.erase(iter)之后,iter及其后面的迭代器已經(jīng)失效了,不應(yīng)該再使用這些迭代器了,再執(zhí)行it++,其行為是未定義的。其它容器也會(huì)遇到迭代器失效的問(wèn)題。
對(duì)于vector被刪除元素的迭代器以及指向后面元素的迭代器全部失效。對(duì)于deque在首部或尾部刪除元素則只會(huì)使指向被刪除元素的迭代器失效,任何其它位置的插入和刪除操作將使指向該容器元素的所有迭代器失效。
對(duì)于list僅有指向被刪除元素的迭代器失效。為什么不同容器迭代器失效情況有差別呢?這主要與各容器的數(shù)據(jù)結(jié)構(gòu)有關(guān)。
18.Qt的圖形處理;
轉(zhuǎn)載于:https://www.cnblogs.com/wzxNote/p/10188381.html
與50位技術(shù)專(zhuān)家面對(duì)面20年技術(shù)見(jiàn)證,附贈(zèng)技術(shù)全景圖總結(jié)
- 上一篇: 类方法classmethod 绑定方法
- 下一篇: 第十一篇 时间序列