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