C++面试常用知识点

1、new和malloc的区别

new操作符从自由存储区上为对象动态分配内存空间,而malloc函数从堆上动态分配内存;
new内存分配失败时会抛出bac_alloc异常,malloc分配内存失败时返回NULL;
new会调用构造和析构,malloc不会;

2、什么时候使用多进程,什么时候使用多线程

这个问题我没有找到答案,自己强行答一下:
线程是共享资源的,所以在稳定性方面会差一些,比如读取写入的时候可能有冲突,但线程创建和销毁的代价很小,当需要经常创建销毁的时候可以使用线程,当为了稳定性的时候可以使用进程。

3、野指针来源和解决方法

来源一:指针变量声明时没有被初始化。
解决办法:指针声明时初始化,可让它指向NULL,不能悬空。

来源二:指针被释放掉之后,没有置为 NULL。
解决办法:指向NULL,不能悬空。

来源三:指针操作超越了变量的作用范围。
解决办法:在变量的作用域结束前释放掉变量的地址空间并且让指针指向NULL。

4、并行和并发区别

并发是指一个处理器同时处理多个任务(分片处理)。
并行是指多个处理器或者是多核的处理器同时处理多个不同的任务(跟分片没有关系)。

5、段内存

就是内存四区里面的bass段,data段

6、C++有哪些性质(面向对象特点)

封装,继承和多态。

7、子类析构时要调用父类的析构函数吗?

看情况:
1、父类指针指向子类,且析构函数为非虚函数:只调用父类的析构函数;
2、父类指针指向子类,且析构函数为虚函数:先调用子类虚构,再调用父类析构;
3、子类指针指向子类:先调用子类析构,再调用父类析构;

定义一个对象时先调用基类的构造函数、然后调用派生类的构造函数;析构的时候恰好相反:先调用派生类的析构函数、然后调用基类的析构函数。

8、纯虚函数和抽象类

虚函数是为了派生类重新定义基类的函数,如果基类的函数只做了声明没有实现,这个函数就称为纯虚函数。
如果一个类至少有一个纯虚函数,那它就是抽象类,抽象类不能创建实例。

9、bool、int、float 分别判空操作
if ( !a ) or if(a)///bool

if ( a == 0)//int

float : const EXPRESSION EXP = 0.000001
if ( a < EXP && a >-EXP)//float 
10、C++函数中值的传递方式有哪几种?

值传递、指针传递和引用传递。

11、内联函数

是为了提高运算效率,但是要求代码简单,且没有循环

12、如何判断一段程序是由C 编译程序还是由C++编译程序编译的?
#ifdef __cplusplus  
    cout<<“c++";  
#else  
    printf("c");  
#endif  
13、引用与指针有什么区别?
  1. 引用必须被初始化,指针不必。
  2. 引用初始化以后不能被改变,指针可以改变所指的对象。
  3. 不存在指向空值的引用,但是存在指向空值的指针
14、用C++写个程序,如何判断一个操作系统是16位还是32位的?不能用 sizeof() 函数。
int a = ~0;
if(a > 65536) {
    cout<<"32 bit"<<endl;
} else {
    cout<<"16 bit"<<endl;
}
15、TCP的黏包和拥堵机制解决

1、发送数据包的时候,连着数据包大小一起发送
2、用特殊的符号作为消息包的分隔符

16、多线程间通信有哪些方式
17、SQL语句

select * from tabel where `字段` = “XX”;

18、C++11新特性
19、设计模式

几大准则,简单工厂模式,工厂方法模式,抽象工厂模式,单例

20、Tcp建立连接三次握手
21、Socket的阻塞非阻塞,同步异步的区别
22 、重载和覆盖有什么区别?

重载是编写函数名相同,参数列表不同的函数。覆盖也叫重写,重写的函数必须有一致的参数表和返回值。

22 、什么情况下用重载,什么情况下用覆盖?

派生类重写基类的虚函数用覆盖。实现同一功能有不同参数列表的函数用重载。

23、他们是怎么实现的?

重载是在编译阶段就知道要调用的函数地址,属于早绑定,是静态的;覆盖要在运行时绑定函数地址,属于晚绑定,是动态的。

24、编译步骤

在main.cpp文件到可执行文件中,有这几步,此处建议动手试一试,总结为E->S->C(戏称ESC):
1、预编译器------->main.i;宏展开,引入头文件

g++ -E main.cpp -o main.i

2、编译器------->main.s(汇编文件),此时还是能看懂的;

g++ -S main.i -o main.s

3、汇编器------->main(目标文件,Windows为.obj,Linux为.o),为二进制,此时已经看不懂;

g++ -C main.cpp -o main.o

4、链接器------->main.exe;(可执行文件)将各个.o文件合起来

g++ main.s -o main
25、友元函数

能访问其他类的私有成员和保护成员

25、socket流程

服务端:socket(),bind(),listen(),accept(),read(),write()
客户端:socket(),connect(),read(),write()

25、多线程通信(互斥锁、信号量),select、epoll的区别

临界区

25、线程池,多个线程频繁申请内存和释放内存会有什么问题,怎么解决。

线程创建和销毁有很大代价,因此使用线程池。申请许多线程排队等待,当有任务出现的时候,就分配给一个线程执行,该线程执行完后不结束,返回到等待状态。

25、进程间通信的方式,常用哪些通信?

管道

26、STL,迭代器

vector 双向链表
list 向量容器
deque 双端队列

  1. 正向迭代器,定义方法如下:容器类名::iterator 迭代器名;
  2. 常量正向迭代器,定义方法如下:容器类名::const_iterator 迭代器名;
  3. 反向迭代器,定义方法如下:容器类名::reverse_iterator 迭代器名;
  4. 常量反向迭代器,定义方法如下:容器类名::const_reverse_iterator 迭代器名;
27、静态函数的作用

1、限定函数作用域,只能在本文件访问;
2、使得可以有另一个重名函数

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值