1.虚函数与纯虚函数:
在类中定义函数时,在函数前加关键字 virtual ,允许在派生类中重写的方法。那么该函数就是虚函数。
纯虚函数:没有实现的方法,用于定义接口。
2.基类为什么需要虚析构函数:
确保删除派生类对象时,基类的析构函数也能被调用。
3.如何初始化const和static数据成员:
class MyClass {
public:
const int value = 10; // 类内直接初始化
};
class MyClass {
public:
static int count;
};
// 类外定义和初始化
int MyClass::count = 0;
4.指针和引用的区别:
1> 引用定义时标识符是&,而指针定义时的标识符是*
2> 定义引用时,必须进行初始化,而定义指针时可以不用初始化
3> 没有空引用,但是可以有空指针
4> 引用一旦指定目标后,就不能进行修改了,而指针后期可以修改指向
5> 引用的使用跟目标一致,而指针的使用需要使用 *运算符
6> 引用就是目标本身,而指针记录的是目标的起始地址
7> 没有多级引用,但是有多级指针
8> 引用不占内存空间,使用的是目标的空间,而指针需要占内存空间
9> 引用的大小跟目标的大小保持一致,而指针的大小全部统一一致都是8字节(64位操作系统)
10> 引用在进行偏移时,就是对目标进行的偏移(如 ref++), 而指针的偏移,就是偏移目标单位内存空间的大小
11> 没有引用数组,但是可以定义指针数组
5.new和malloc的区别:
构造函数和析构函数:
new 会自动调用对象的构造函数,而 malloc 不会。同样地,delete 会自动调用析构函数,而 free 不会。
类型安全:
new 是类型安全的,返回一个正确的指针类型,可以直接赋值给一个指针变量。
malloc 返回 void* 类型,需要显式类型转换。
表达式:
new 是一个运算符,可以与类型一起使用,如 new int。
malloc 是C标准库函数,需要指定分配的字节大小,如 malloc(sizeof(int))。
错误处理:
new 在内存分配失败时抛出 std::bad_alloc 异常(除非使用了 new (nothrow))。
malloc 在失败时返回 nullptr。
重载:
new 和 delete 运算符可以被重载,允许自定义类的内存分配和释放行为。
malloc 和 free 不能被重载,它们定义在全局命名空间。
6.内存泄漏的产生与避免:
产生原因
忘记释放内存:
使用 new 或 malloc 分配了内存,但忘记使用 delete 或 free 释放。
异常导致:
在抛出异常的过程中,如果对象是通过 new 分配的,而没有相应的 delete,那么在异常处理中可能会忘记释放。
野指针:
指针指向已释放的内存,但指针本身未被设为 nullptr,后续可能错误地使用该指针。
循环引用:
在使用智能指针时,如果存在循环引用,智能指针可能无法正确释放内存。
如何避免内存泄漏
使用智能指针:
C++11引入了智能指针,如 std::unique_ptr 和 std::shared_ptr,它们可以自动管理内存。
确保异常安全:
在可能抛出异常的代码块中,确保所有动态分配的内存在异常抛出前被释放。
7.c++的内存分区
栈,堆,全局\静态存储区,常量存储区,代码段,线程局部分区,C++11引入的内存分区
8.说说你常用的设计模式及其应用场景:
9.常用的数据结构有哪些,时间复杂度和空间复杂度如何使用
数组,链表,栈,队列,哈希表,二叉树,堆
时间复杂度:
描述算法随着输入规模增长,执行时间的增长趋势。
常用大O表示法,如 O(1), O(log n), O(n), O(n log n), O(2^n) 等。
空间复杂度:
描述算法随着输入规模增长,所需存储空间的增长趋势。
同样使用大O表示法。
分析算法:在设计算法时,分析算法的时间和空间复杂度,以选择最优解。
优化性能:通过优化算法来降低时间复杂度,或使用更少的空间来降低空间复杂度。
10.描述Qt下Tcp通信的整个流程
包含必要的头文件:
创建QTcpServer:
监听端口:
处理新的连接:
接受连接:
客户端连接服务器:
等待连接成功:
数据传输:
处理数据:
关闭连接:
错误处理:
资源清理:
11.如何使用c++模拟Qt信号和槽
步骤1: 定义信号
首先,定义一个信号,它是一个可以存储和触发回调函数的类。
步骤2: 定义槽
槽是响应信号的函数。你可以定义任何符合信号期望的函数签名的函数或lambda表达式。
步骤3: 连接信号和槽
创建信号和槽的实例,并将槽连接到信号。
12.Qt中的智能指针的特点和用途
指针的特点和用途:
1. QScopedPointer
特点:
自动删除指向的对象。
保证对象的单一所有权。
不能被空值初始化。
用途:
当你需要确保一个对象在作用域结束时被自动删除时使用。
2. QSharedPointer
特点:
使用引用计数机制管理对象的生命周期。
可以被多个指针共享。
当最后一个引用被删除时,对象会被自动删除。
线程安全。
用途:
当需要多个对象共享同一个动态分配的对象时使用。
3. QWeakPointer
特点:
与QSharedPointer配合使用,不增加引用计数。
可以安全地从拥有QSharedPointer的对象中获取弱引用。
当指向的对象被删除时,QWeakPointer会被自动清空。
用途:
用于解决循环引用问题,避免内存泄漏。
4. QPointer
特点:
继承自QObject的类的QObject指针。
自动删除指向的对象,当对象被删除时,指针会被自动设为nullptr。
用途:
当你想要自动管理QObject派生类的生命周期,并且希望在对象被销毁时自动将指针设为nullptr。