C++
-
C++ 和C的主要区别
C语言是面向过程编程,C++是面向对象编程,C++ 完全兼容C
-
C++有哪些特性,简述对他们的理解
封装、继承、多态
封装
将的事物抽象成一个个集合(也就是所说的类),实现代码的模块化
继承
子类可以继承父类的方法,实现代码重用
多态
子类继承父类之后,父类指针指向子类对象,实现接口重用
-
引用和指针的区别
- 引用是变量的一个别名,内部实现是只读指针
- 引用只能在初始化时被赋值,其他时候值不能被改变,指针的值可以在任何时候被改变
- 引用不能为NULL,指针可以为NULL
- 引用变量内存单元保存的是被引用变量的地址
- “sizeof 引用" = 指向变量的大小 , "sizeof 指针"= 指针本身的大小
- 引用可以取地址操作,返回的是被引用变量本身所在的内存单元地址
- 引用使用在源代码级相当于普通的变量一样使用,做函数参数时,内部传递的实际是变量地址
-
重载和重写的区别
重载:是指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同,或许参数类型不同,或许两者都不同)。
重写:是指子类重新定义父类虚函数的方法。
-
C++ delete和delete[]的区别
delete只会调用一次析构函数,而delete[]会调用每一个成员的析构函数
-
const与#define 相比,有何优点?
const作用:定义常量、修饰函数参数、修饰函数返回值三个作用。被Const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性
const 常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误
-
关键字static的作用
- 可以用于全局变量的定义:为该变量分配静态存储区。程序运行结束前不会被释放。
- 声明和定义静态成员函数:表示该函数为静态函数,只能在本文件中被调用。
- 定义静态局部变量:只被初始化一次,只有程序运行结束才会释放。区别是作用域的范围
C++ - STL
-
使用过哪些STL容器
vector,list,deque,map,multimap,set,multiset
-
使用过那些算法
查找算法、排序算法、消除算法、计数算法、比较算法、变换算法、置换算法和容器管理等
Linux
-
使用过哪些linux命令
文件管理命令 磁盘管理命令 网络通信命令 系统管理命令 备份压缩命令 cat cd ifconfig ps bzip2 cp ls iptables free gzip rm mkdir netstat kill tar find pwd ping yum unzip -
linux下多进程和多线程的区别
线程具有许多传统进程所具有的特征,故又称为轻型进程(Light—Weight Process)或进程元;而把传统的进程称为重型进程(Heavy—Weight Process),它相当于只有一个线程的任务。在引入了线程的操作系统中,通常一个进程都有若干个线程,至少包含一个线程。
根本区别:进程是操作系统资源分配的基本单位,而线程是处理器任务调度和执行的基本单位
资源开销:每个进程都有独立的代码和数据空间(程序上下文),程序之间的切换会有较大的开销;线程可以看做轻量级的进程,同一类线程共享代码和数据空间,每个线程都有自己独立的运行栈和程序计数器(PC),线程之间切换的开销小。
包含关系:如果一个进程内有多个线程,则执行过程不是一条线的,而是多条线(线程)共同完成的;线程是进程的一部分,所以线程也被称为轻权进程或者轻量级进程。
内存分配:同一进程的线程共享本进程的地址空间和资源,而进程之间的地址空间和资源是相互独立的
影响关系:一个进程崩溃后,在保护模式下不会对其他进程产生影响,但是一个线程崩溃整个进程都死掉。所以多进程要比多线程健壮。
执行过程:每个独立的进程有程序运行的入口、顺序执行序列和程序出口。但是线程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制,两者均可并发执行
-
进程间通信的方式有哪些
管道
共享内存
套接字
内存映射
信号(一般不用,优先级太高容易打断程序正常执行,且携带信息量小)
QT
-
使用过哪些QT控件
Widget
dialog
Box
button
...
-
使用过哪些QT事件
keyboard 键盘事件
mouse 鼠标事件
timer 定时器事件
...
-
QT信号槽机制的优缺点
优点
- QT信号槽机制的引用精简了程序员的代码量 (不用写回调函数)
- QT的信号可以对应多个槽(但他们的调用顺序随机),也可以多个槽映射一个信号
- QT的信号槽的建立和解除绑定十分自由
缺点
- 信号槽同真正的回调函数比起来时间的耗损还是很大的,所有在嵌入式实时系统中应当慎用
- 信号槽的参数限定很多例如不能携带模板类参数,不能出现宏定义等等
-
QT下UDP和TCP的通信流程
QT下udp通信服务器端和客户端的关系是对等的, 做的处理也是一样的
- 创建套接字对象
- 如果需要接收数据, 必须绑定端口
- 发送数据: writeDatagram
- 接收数据: readDatagram
TCP
服务器端:
- 创建用于监听的套接字
- 给套接字设置监听
- 如果有连接到来, 监听的套接字会发出信号newConnected
- 接收连接, 通过nextPendingConnection()函数, 返回一个QTcpSocket类型的套接字对象(用于通信)
- 使用用于通信的套接字对象通信
- 发送数据: write
- 接收数据: readAll/read
客户端:
- 创建用于通信的套接字
- 连接服务器: connectToHost
- 连接成功与服务器通信
- 发送数据: write
- 接收数据: readAll/read
CODE
-
写出下列程序执行后的结果
#include <iostream.h> class A { virtual void g() { cout << "A::g" << endl; } private: virtual void f() { cout << "A::f" << endl; } }; class B : public A { void g() { cout << "B::g" << endl; } virtual void h() { cout << "B::h" << endl; } }; typedef void( *Fun )( void ); void main() { B b; Fun pFun; for(int i = 0 ; i < 3; i++) { pFun = ( Fun )*( ( int* ) * ( int* )( &b ) + i ); pFun(); } } /* 输出结果: B::g A::f B::h */
-
写出下列程序执行后的结果
#include <iostream.h> main() { int x[]= {10, 20, 30, 40, 50 }; int *p; p=x; cout << *(p+2) << endl; } /* 运行结果为: 30 */
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步