金山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的文件系统
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
6.QT QObject的线程相关性
7.Https的几种返回码
8.json和protoful的区别
9.map遍历的时间复杂度
10.list插入的时间复杂度
11.迭代器和指针的区别
12.c++11的新特性 Lambada的传值的几种方式
13.QML中C++和QML如何交互和传值
14.QEventLoop
15.内存回收机制

16.c++的类型转换

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仅有指向被删除元素的迭代器失效。为什么不同容器迭代器失效情况有差别呢?这主要与各容器的数据结构有关。

猜你喜欢

转载自www.cnblogs.com/wzxNote/p/10188381.html