QT、C++面试中的几个问题

33 篇文章 4 订阅

1、虚析构
delete基类指针指向派生类时防止子类的数据不会被释放造成内存泄漏
当父类指针指向子类时,只会调用父类析构函数,子类析构函数不被调用,会造成内存泄漏
将父类的析构函数定义为虚析构函数,那么父类指针会先调用子类析构,再调用父类析构,使内存得到释放

静态库和动态库在运行期某变量发生变化,调用者能否感知
静态库是在编译期进行连接,相当于拷贝了一份代码,特点是程序在运行时与函数库再无瓜葛,移植方便,
缺点是浪费空间和资源,因为所有相关得目标文件与牵涉到得函数库被链接合成一个可执行文件,程序得更新
、部署和发布也会带来麻烦。
动态库把对一些库函数的链接载入推迟到程序运行时期,可以实现进程之间的资源共享(因此动态库也称为共享库)
,将一些程序升级变得简单。

由此可见运行期改变静态库中的变量,调用者不会感知到,因为使用的是拷贝的那一份。

 

2、跨线程的信号槽
connect用于连接qt的信号和槽,在qt编程过程中不可或缺。它其实有第五个参数,只是一般使用默认值,在满足某些特殊需求的时候可能需要手动设置。

Qt::AutoConnection: 默认值,使用这个值则连接类型会在信号发送时决定。如果接收者和发送者在同一个线程,则自动使用Qt::DirectConnection类型。如果接收者和发送者不在一个线程,则自动使用Qt::QueuedConnection类型。

Qt::DirectConnection:槽函数会在信号发送的时候直接被调用,槽函数运行于信号发送者所在线程。效果看上去就像是直接在信号发送位置调用了槽函数。这个在多线程环境下比较危险,可能会造成奔溃。

Qt::QueuedConnection:槽函数在控制回到接收者所在线程的事件循环时被调用,槽函数运行于信号接收者所在线程。发送信号之后,槽函数不会立刻被调用,等到接收者的当前函数执行完,进入事件循环之后,槽函数才会被调用。多线程环境下一般用这个。

Qt::BlockingQueuedConnection:槽函数的调用时机与Qt::QueuedConnection一致,不过发送完信号后发送者所在线程会阻塞,直到槽函数运行完。接收者和发送者绝对不能在一个线程,否则程序会死锁。在多线程间需要同步的场合可能需要这个。

Qt::UniqueConnection:这个flag可以通过按位或(|)与以上四个结合在一起使用。当这个flag设置时,当某个信号和槽已经连接时,再进行重复的连接就会失败。也就是避免了重复连接。

QObject::connect()本身是线程安全的。槽函数一般是不安全的。

3、多态的应用

重载、继承、模板,重点介绍模板

模板:

template <typename T>
void swap(T &a, T &b)
{
    T temp = a;
    a = b;
    b = T;
}

 

template告诉编译器开始泛型编程,typename告诉编译器T是一个泛型类型

调用:自动推导调用 swap(a, b),具体类型显示调用 swap<int>(a, b)

有返回值的函数模板

template <typename T1, typename T2, typename T3>
T1 add(const T2 &a, T3 &b)
{
    T1 temp;
    temp = static_cast<T1>(a + b);
    return temp;
}

调用

int a = 1;
float b = 0.1;
cout << add(a + b) << endl; //编译时会报错,因为没有指定返回值类型
cout << add <int>(a + b) << endl; //指定了返回类型为int
cout << add <float, int, float>(a + b) << endl; //指定类返回类型为float

有以上代码可见,<>中指定的类型,是按照模板中的顺序对应的,即T1,T2,T3,参数类型可以自动推导,可以缺省。

4、const不同位置的作用

const用于修饰常量,修饰距离它最近的对象。

const int* p;//p是一个指向int型常量的指针

int* const p;//p是指向int型的常量指针

const int size() {} //返回值是int型常量

int size() const {} //函数执行过程中不改变函数内变量的值,为了安全,防止数据无故被改

int add(const int &a, const int &b) //a,b是常量引用,函数执行过程中不可修改a,b的值

int add(const int a, const int b) //形参a,b是常量

5、通讯中的序列化和反序列化

6、json的序列化原理

7、UDP和TCP

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值