C++基础⾯试题及答案
C++
1. C++ 和C的主要区别
C语⾔是⾯向过程编程,C++是⾯向对象编程,C++ 完全兼容C
2. C++有哪些特性,简述对他们的理解
封装、继承、多态
封装
将的事物抽象成⼀个个集合(也就是所说的类),实现代码的模块化
继承
⼦类可以继承⽗类的⽅法,实现代码重⽤
多态
⼦类继承⽗类之后,⽗类指针指向⼦类对象,实现接⼝重⽤
3. 引⽤和指针的区别
1. 引⽤是变量的⼀个别名,内部实现是只读指针
2. 引⽤只能在初始化时被赋值,其他时候值不能被改变,指针的值可以在任何时候被改变
3. 引⽤不能为NULL,指针可以为NULL
4. 引⽤变量内存单元保存的是被引⽤变量的地址
5. “sizeof 引⽤" = 指向变量的⼤⼩, "sizeof 指针"= 指针本⾝的⼤⼩
6. 引⽤可以取地址操作,返回的是被引⽤变量本⾝所在的内存单元地址
7. 引⽤使⽤在源代码级相当于普通的变量⼀样使⽤,做函数参数时,内部传递的实际是变量地址
4. 重载和重写的区别
重载:是指允许存在多个同名函数,⽽这些函数的参数表不同(或许参数个数不同,或许参数类型不同,或许两者都不
同)。
重写:是指⼦类重新定义⽗类虚函数的⽅法。
5. C++ delete和delete[]的区别
delete只会调⽤⼀次析构函数,⽽delete[]会调⽤每⼀个成员的析构函数
6. const与#define相⽐,有何优点?
const作⽤:定义常量、修饰函数参数、修饰函数返回值三个作⽤。被Const修饰的东西都受到强制保护,可以预防意外的变动,能提⾼程序的健壮性
const 常量有数据类型,⽽宏常量没有数据类型。编译器可以对前者进⾏类型安全检查。⽽对后者只进⾏字符替换,没有类型安全检查,并且在字符替换可能会产⽣意料不到的错误
7. 关键字static的作⽤
1. 可以⽤于全局变量的定义:为该变量分配静态存储区。程序运⾏结束前不会被释放。
2. 声明和定义静态成员函数:表⽰该函数为静态函数,只能在本⽂件中被调⽤。
3. 定义静态局部变量:只被初始化⼀次,只有程序运⾏结束才会释放。区别是作⽤域的范围
C++ - STL
1. 使⽤过哪些STL容器
vector,list,deque,map,multimap,set,multiset
2. 使⽤过那些算法
查算法、排序算法、消除算法、计数算法、⽐较算法、变换算法、置换算法和容器管理等
Linux
1. 使⽤过哪些linux命令
⽂件管理命令磁盘管理命令⽹络通信命令系统管理命令备份压缩命令
cat cd ifconfig ps bzip2
cp ls iptables free gzip
rm mkdir netstat kill tar
find pwd ping yum unzip
2. linux下多进程和多线程的区别
线程具有许多传统进程所具有的特征,故⼜称为轻型进程(Light—Weight Process)或进程元;⽽把传统的进程称为重型进程(Heavy—Weight Process),它相当于只有⼀个线程的任务。在引⼊了线程的操作系统中,通常⼀个进程都有若⼲个线程,⾄少包含⼀个线程。
根本区别:进程是操作系统资源分配的基本单位,⽽线程是处理器任务调度和执⾏的基本单位
资源开销:每个进程都有独⽴的代码和数据空间(程序上下⽂),程序之间的切换会有较⼤的开销;线程可以
看做轻量级的进程,同⼀类线程共享代码和数据空间,每个线程都有⾃⼰独⽴的运⾏栈和程序计数器(PC),
线程之间切换的开销⼩。
包含关系:如果⼀个进程内有多个线程,则执⾏过程不是⼀条线的,⽽是多条线(线程)共同完成的;线程是
进程的⼀部分,所以线程也被称为轻权进程或者轻量级进程。
内存分配:同⼀进程的线程共享本进程的地址空间和资源,⽽进程之间的地址空间和资源是相互独⽴的
影响关系:⼀个进程崩溃后,在保护模式下不会对其他进程产⽣影响,但是⼀个线程崩溃整个进程都死掉。所
以多进程要⽐多线程健壮。
执⾏过程:每个独⽴的进程有程序运⾏的⼊⼝、顺序执⾏序列和程序出⼝。但是线程不能独⽴执⾏,必须依存
在应⽤程序中,由应⽤程序提供多个线程执⾏控制,两者均可并发执⾏
3. 进程间通信的⽅式有哪些
管道
共享内存
套接字
内存映射
信号(⼀般不⽤,优先级太⾼容易打断程序正常执⾏,且携带信息量⼩)
QT
1. 使⽤过哪些QT控件
Widget
dialog
Box
button
...
2. 使⽤过哪些QT事件
keyboard 键盘事件
mouse ⿏标事件
timer 定时器事件
...
3. QT信号槽机制的优缺点
优点
1. QT信号槽机制的引⽤精简了程序员的代码量 (不⽤写回调函数)
2. QT的信号可以对应多个槽(但他们的调⽤顺序随机),也可以多个槽映射⼀个信号
3. QT的信号槽的建⽴和解除绑定⼗分⾃由
缺点
1. 信号槽同真正的回调函数⽐起来时间的耗损还是很⼤的,所有在嵌⼊式实时系统中应当慎⽤
2. 信号槽的参数限定很多例如不能携带模板类参数,不能出现宏定义等等
4. QT下UDP和TCP的通信流程
QT下udp通信服务器端和客户端的关系是对等的, 做的处理也是⼀样的
1. 创建套接字对象
2. 如果需要接收数据, 必须绑定端⼝
3. 发送数据: writeDatagram
4. 接收数据: readDatagram
TCP
服务器端:
1. 创建⽤于监听的套接字
2. 给套接字设置监听
3. 如果有连接到来, 监听的套接字会发出信号newConnected
4. 接收连接, 通过nextPendingConnection()函数, 返回⼀个QTcpSocket类型的套接字对象(⽤于通信)
5. 使⽤⽤于通信的套接字对象通信
6. 发送数据: write
一个线程可以包含多个进程7. 接收数据: readAll/read
客户端:
1. 创建⽤于通信的套接字
2. 连接服务器: connectToHost
3. 连接成功与服务器通信
4. 发送数据: write
5. 接收数据: readAll/read
CODE
1. 写出下列程序执⾏后的结果
#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
*/
2. 写出下列程序执⾏后的结果
#include <iostream.h>
main()
{
int x[]= {10, 20, 30, 40, 50 };
int *p;
p=x;
cout << *(p+2) << endl;
}
/*
运⾏结果为:
30
*/
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论