零散笔记(八)

1、成员函数里memset(this,0,sizeof(*this))会发生什么。会把内存设置为0。如果类有虚函数指针,这会破坏虚函数指针。如果有非默认类型的数据,会对数据造成破坏。

2、如何区分左值和右值。左值可以&,右值不可。或者通过函数参数列表的不同写法。

3、为什么C++访问虚函数比访问普通函数慢。因为要先访问虚函数指针,获得虚函数表的位置,再去虚函数表中找对应函数。

4、为什么需要纯虚函数。要求子类必须实现这个方法,同时强制不能实例化基类。

5、const和static能同时修饰成员函数吗。不能,const表示的是该函数不会修改实例对象,但static就没有实例对象一说。

6、动态链接库和静态链接库的区别。动态链接就是在程序运行时再去找所需要的库,静态链接就是把库的代码同时编译进程序。

7、C++中堆和栈的区别。堆是由程序员自己控制的内存获取和释放,栈是由操作系统控制的。每个函数都有自己的栈空间,而所有函数共享一个堆空间。堆空间一般比栈大很多。

8、关键字static。对普通变量,相当于把变量放置到全局区,然后限制作用域。对普通函数,限制作用域。对成员变量,使得变量属于类,而不是属于对象。对成员函数,使得函数属于类,不属于对象,无法只能使用静态成员变量。

9、什么是内存泄漏?什么是野指针?什么是内存越界?如何避免?内存泄漏就是程序员主动申请的堆内存没有释放。野指针就是指针原先指向的对象释放了,但指针还依然指向该地址,比如函数返回后栈上的对象被释放了。内存越界就是访问了非法的内存地址。

10、描述一下封装、继承、多态。封装就是类对外提供接口,隐藏内部实现细节,只有通过方法才能获取或修改属性。继承就是子类与基类之间形成了一个a kind of的关系,子类获得基类的方法和属性等等。多态就是一个接口,多种实现。

11、如何理解智能指针。智能指针就是运用类的构造函数和析构函数来实现内存的分配与释放。

12、Reactor模式。主线程只监听文件描述符上是否有事件发生,有的话就通知工作线程。读写,建立新连接,处理数据,都放在工作线程进行。

13、share_ptr与weak_ptr的区别与联系。share_ptr和weak_ptr都是可以多个指针指向同一对象,但share会改变引用计数,weak不会。weak可以解决循环计数的问题。

14、strtok函数在使用上要注意什么问题。会对源字符串进行更改。

15、char * const p ,char const * p, char const * const p区别。第一个是const指针,第二个是const被指物,第三个是两个都是const。

16、介绍一下右值引用和移动语义和完美转发。右值引用就是把之前无法利用的临时对象引用一下。move是移动语义,强制右值。forward是完美转发,左转左,右转右。

17、描述下C++的浅copy,深copy,写时copy和引用计数的copy。浅拷贝就是引用,深拷贝就是声明了一个新的变量。写时拷贝就是并没有复制,当检测到有写的行为时,检查引用计数,如果不为1,再拷贝一份新的,在新的上修改。

18、内联函数、构造函数、静态成员函数可以是虚函数么。不可以。

19、析构函数可以调用虚函数,构造函数为什么不可以调用虚函数。构造函数时还未初始化虚函数指针,找不到对应的函数执行位置。

20、构造函数和析构函数可以调用虚函数吗。析构函数可以,但最好不要,构造函数不可以。

21、C++4种类型转换。static_cast,dynamic_cast,const_cast,rxxx_cast。

22、什么时候要用虚析构函数。有继承情况时,防止基类指针指向子类的情况,delete时没调用子类的析构函数。

23、stl实现了那些排序算法。sort,stable_sort,不稳定和稳定的。sort用的是内省式排序,stable_sort用的是归并。

24、一元、二元仿函数的区别和使用背景。参数列表不同。为了在泛型编程中传入一个可被使用的,类似函数调用一样的东西。

25、常见的内存错误及其对策。内存未分配成功,却使用了它,对策是检查是否为NULL。内存分配成功,但是没有初始化,对策是赋初始值。内存访问超过下标,对策是检查边界。忘记释放内存,对策是释放。释放了之后再使用,对策是释放后把指针设为NULL。

26、静态成员函数存在的意义。如果某一个类,需要提供某种操作,但是如果每次都要实例化一个对象才能调用无疑会降低性能。

27、多线程如何实现通讯,如何进行同步。通讯可以通过读取全局变量等方法。同步要使用信号量。

28、三种内存对象的比较。堆栈静态区。堆需要手动申请和释放,栈是函数调用中自动申请和释放,静态区则是static变量。

29、C++内存泄露及检测工具。忘记释放堆内存就是内存泄漏。有工具可检测。

30、什么是RTTI (Run-time type identification)。type(a).name()即可拿到类型的名字。

31、TCP和UDP有什么区别。TCP首部20字节,UDP首部8字节。TCP提供可靠连接,UDP提供较快交付。TCP有拥塞控制,UDP没有。TCP有重传,UDP没有。

32、编写socket套接字的步骤。socket(),bind(),listen(),accept(),send(),recv(),close()。

33、网络体系结构。OSI模型,物理层,数据链路层,网络层,传输层,会话层,表示层,应用层。TCP/IP模型,物理层,数据链路,网络层,传输层,应用层。

34、TCP三次握手和四次挥手。三次握手,A发SYN给B,B发ACK/SYN给A,A发ACK给B。四次挥手,A发FIN给B,B发ACK给A,B发FIN给A,A发ACK给B。

35、程序什么时候应该使用线程,什么时候单线程效率高。处理时间短,启动频率高的单线程。任务可以并行执行,或者单线程有可能阻塞影响执行的,用多线程。

36、惊群现象。多个进程或线程监听同一socket时,可能会导致同时被唤醒,但是只有一个能处理。解决方法,用reactor方式。

37、C++函数内的静态变量初始化。第一次用的时候初始化。

38、C++线程安全的单例类。用饿汉式而不是懒汉式。

39、并行编程中多进程和多线程,什么情况下多进程能解决的多线程无法解决。线程挂掉会影响到进程,如果要多个处理事件的过程中互不影响,可以考虑多进程。

40、HTTP协议和TCP的区别。HTTP是应用层的协议,TCP是传输层的协议。HTTP没有固定首部,TCP有固定首部。HTTP低版本使用了TCP来传输,但是HTTP3.0使用的是UDP。

41、同步IO和异步IO的区别。同步IO就是操作系统通知之后,需要程序自己从缓冲区中读出数据,异步IO就是操作系统通知之后,数据已经在规定的地方了。

42、什么是网络套接字(Socket)?流套接字(SOCK_STREAM)基于什么协议。在Linux中就是一个文件,可以被读写。基于TCP协议。

43、IP首部、TCP首部、UDP首部。IPV4固定20字节,IPV6固定40字节,TCP固定20字节,UDP固定8字节。

44、TCP和UDP的应用场景。需要可靠连接时用TCP,需要速度时用UDP。既要速度又要可靠性,可以魔改UDP,加上拥塞控制等功能。

45、引用作为函数参数有哪些特点。可修改外部变量,用指针实现的,无拷贝构造函数和析构函数。

46、在什么时候需要使用常引用。函数保证不会修改外部变量。

47、将引用作为函数返回值类型的格式、好处和需要遵守的规则。T& func()。可以返回类内部的对象。不要返回局部对象的引用,因为函数返回后该对象将不复存在。

48、拷贝构造函数在哪几种情况下会被调用。用对象初始化对象,值传递时,返回值是对象时(返回值优化一般来说优化掉了)。

49、多态的作用。一个接口,多种方法,不需要根据派生类的类型写ifelse。

50、说出字符常量和字符串常量的区别,并使用sizeof 计算有什么不同。单引号的是字符常量,字符串常量就是双引号的。字符串常量结尾会有一个/0。

发表评论

电子邮件地址不会被公开。 必填项已用*标注