- 拷贝构造函数通常用于
当用类的一个对象去初始化该类的另一个对象(或引用)时系统自动调用拷贝构造函数实现拷贝赋值
若函数的形参为类对象,调用函数时,实参赋值给形参,系统自动调用拷贝构造函数
当函数的返回值是类对象时,系统自动调用拷贝构造函数
- 必须使用的情况
如果在类中没有定义拷贝构造函数,编译器会自行定义一个。如果类带有指针变量,并有动态内存分配,则它必须有一个拷贝构造函数
- 必须使用的情况
Line::Line(const Line &obj){ // &obj是对象line的一个引用,用这个对象的引用来初始化另一个对象
cout << "调用拷贝构造函数,并为指针ptr分配内存" << endl;
ptr = new int;
*ptr = *obj.ptr; // 拷贝值
}
- 防止默认拷贝的发生 私有化
4.一边遍历一边删除vector
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> v;
for(int i = 0; i < 10; i++){
v.push_back(i);
}
auto it = v.begin();
while(it != v.end()){
if(*it == 1){
it = v.erase(it);
}
else it++;
}
for(int i = 0; i < v.size(); i++){
cout << v[i] << endl;
}
return 0;
}
- 单例模式的实现
构造函数私有化 加一个公有函数 getinstance 加锁
- 单例模式的实现
- vector 随机访问时间复杂度 O(1) 插入删除 O(n)
list 随机访问时间复杂度 O(n) 插入删除 O(1)
- vector 随机访问时间复杂度 O(1) 插入删除 O(n)
- 哈希表的原理
其基本原理是:使用一个下标范围比较大的数组来存储元素。可以设计一个函数(哈希函数,也叫散列函数),使得每个元素的关键字都与一个函数值(即数组下标,hash值)相对应,于是用这个数组单元来存储这个元素;也可以简单的理解为,按照关键字为每一个元素“分类”,然后将这个元素存储在相应“类”所对应的地方,称为桶。
但是,这不能够保证每个元素的关键字与函数值是一一对应的,因此极有可能出现对不不同的元素,却计算出相同的函数值,这样就产生了“冲突”。换句话说,就是把不同的元素分在了相同的“类”中。总的来说,“直接定址”和“解决冲突”是哈希表的两大特点
- 哈希表的原理
- 多线程下,信号槽分别在什么线程中执行,如何控制
可以通过connect的第五个参数进行控制信号槽执行时所在的线程
connect有几种连接方式,直接连接和队列连接、自动连接
直接连接:信号槽在信号发出者所在的线程中执行
队列连接:信号在信号发出者所在的线程中执行,槽函数在信号接收者所在的线程中执行
自动连接:多线程时为队列连接函数,单线程时为直接连接函数
- 运行某些耗时操作如果界面程序很卡 ,你会怎么优化
数据库相关的工作、写磁盘,网络连接
- 运行某些耗时操作如果界面程序很卡 ,你会怎么优化
- qt哪几种创建线程的方式
继承QThread run
继承object MoveThread
- qt哪几种创建线程的方式
- 线程同步的方式
互斥锁 条件变量 读写锁 信号量
- 线程同步的方式
12.线程间共享的资源有
共享的资源有
a. 堆 由于堆是在进程空间中开辟出来的,所以它是理所当然地被共享的;因此new出来的都是共享的(16位平台上分全局堆和局部堆,局部堆是独享的)
b. 全局变量 它是与具体某一函数无关的,所以也与特定线程无关;因此也是共享的
c. 静态变量 虽然对于局部变量来说,它在代码中是“放”在某一函数中的,但是其存放位置和全局变量一样,存于堆中开辟的.bss和.data段,是共享的
d. 文件等公用资源 这个是共享的,使用这些公共资源的线程必须同步。Win32 提供了几种同步资源的方式,包括信号、临界区、事件和互斥体。
独享的资源有
a. 栈 栈是独享的
b. 寄存器