
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。



















