1.Qt线程共享数据的两种方式:共享内存,如全局变量,类静态成员变量,两个线程都可以访问和修改改变量;Signal/Slot机制,把数据从一个线程传递到另一个线程。
2.类的大小是1字节;指针大小
16位:1; 32 位:4; 64 位 8;
3.STL 标准模板库 广义:算法、容器、迭代器 仿函数、适配器、空间配置器
中的哈希map 虚函数
4.虚函数的作用:简单讲即实现多态。
基类定义了虚函数,子类可以重写该函数,当子类重新定义了父类的虚函数后,父类指针根据赋给它的不同的子类指针,动态地调用属于子类的该函数,且这样的函数调用是无法在编译器期间确认的,而是在运行期确认,也叫做迟绑定。
5.http码 200成功400请求无效403禁止访问 404资源不存在500内部服务器出错
6.强制转换
7.空指针 内存指向编号为0的空间 编号0-255是系统占用的;空指针是把指针初始化的,但是不可访问。
野指针:指向一个非法内存空间,解引用或者说访问会报错。
常量指针:const int *p = &a; // p代表指针 *p解引用
指针的值不可修改,*p=20(错误) 指向内存地址可以修改 p =&b;
指针常量:int *const p = &a;
指针的指向不可修改 p=&b(错误);指针的值可以改*p = 10正确;
8. 8进制前面加0 16进制加0x,
9. static 静态成员函数 静态成员变量
类内声明,类外初始化。所有对象共享一份数据,访问方式:1通过对象进行访问
p.m_a;2通过类名进行访问person::
静态成员函数:所有对象共享一个函数;静态 成员函数只能
10.string 是继承basic_char,包含数组长度数量,可扩展空间,每次都是二倍大小。
(1)vector
vector容器分配的是一块连续的内存空间,每次容器的增长,并不是在原有连续 的内存空间后再进行简单的叠加,而是重新申请一块更大的新内存,并把现有容器中的元素逐个复制过去,然后销毁旧的内存。
是单端数组,可以动态扩展,即将原数据拷贝到新空间,释放原空间,支持随机访问的迭代器;
尾插push_back 尾删pop_back插入insert删除erase
插入会先执行拷贝构造函数,
优化:设置内存大小 vector.reserve(3);
resize重新制定大小 默认填充0;resize(15,1)填充1;
(2)deque容器
双端数组,可以对头尾进行删除和插入,内部有中控器,维护每个缓冲区的地址,看起来像连续的空间。
区别:vector可以随机存储元素,直接计算用公式计算出元素地址,不需要挨个查找,对头部插入删除效率低,适合对象数量变化不大;vector访问元素的速度比deque快,可以对首尾两端进行删除操作;
(3)stack 先进后出的数据结构。入栈:push 出栈:pop
栈不可遍历,只有栈顶才能被访问。
(4)queue 先进先出 入:push 出:pop
(5)list
链表是由节点组成的,包括数据域和指针域,指针域包括下一个节点的地址,最后一个指向null;
优缺点:可以快速的对任意位置进行插入和删除操作;遍历速度没有数组快;所占空间比数组大。
STL中的链表是双向循环链表,存储不是连续空间,动态分配内存,不会造成内存溢出和浪费;list的随机存取非常没有效率,时间复杂度为o(n); 但由于链表的特点,能高效地进行插入和删除。;空间(指针域)和时间(遍历)消耗都很大;
(6)set/multiset 自动排序;不允许重复/允许重复 关联式容器,底层结构是二叉树;
size()返回数目,不允许设置大小;插入insert 删除erase
pair对组成对出现,可以返回两个数据;
(7)map 一对一映射关系 insert find
元素都是pair《key:键值起索引作用;value:实值》根据key自动排序,是二叉树实现
根据key快速找到value map、不允许有重复key multimap允许有重复key
map底层是采用红黑树实现的,插入删除查询时间复杂度都是O(log(n)),它的内部是有序的,因此需要实现比较操作符(<)
template