零散笔记(六)

1、epoll水平触发就是如果缓冲区里有东西,就会一直返回fd。而边缘触发就是有数据量变化的时候才触发。

2、硬链接就是和文件指向同一个硬盘区域,是同一个文件。而软链接不是同一个文件,指向不同的区域,相当于保存的是文件的绝对路径。

3、系统调用、异常、外围设备的中断可以使用户态进入内核态。内核态不受限制的访问内存和CPU,用户态受限。特权级0-3,内核态在0,用户态在3。

4、说说C/C++的区别。C是面向过程的语言,C++是面向对象的语言。C++对C中常用的一些东西进行了包装或重写,使之更加安全和高效,更符合现代软件工程的要求。

5、说说malloc/free 和 new/delete区别。他们都是申请堆内存的函数。但new会调用类的构造函数,delete会调用析构函数。除此之外,new和delete还可以重载。三种new,operatpor new,nothrow new,placement new。

6、如何防止头文件被重复包含。使用#ifndef或者是#pragma once,后者较新,旧版本编译器可能不支持。

7、STL set 和 map都是基于什么实现的。红黑树。

8、表述下string的Copy-On-Write技术,写时copy。string使用拷贝构造函数时,并不是深拷贝,而是浅拷贝。在原来的string上加了一个引用。string要改变时,会先检查引用数是否为1,如果是,则可以改变;如果不是,则开辟新的内存空间,将原string拷贝过来,同时将引用-1,再进行改变。string的析构函数也会检查引用,引用为1时才会销毁该段内存。

9、多态的实现。静态多态就是重载函数,编译时确定函数位置。动态多态就是在运行时确定函数位置。基类可以把函数设置为virtual,即虚函数。虚函数又分为纯虚函数和半虚函数,取决于基类有没有定义。虚函数的调用是通过虚函数表来实现的。

10、C++构造函数是否可以抛出异常。可以的。新对象的建立分为分配内存和调用构造函数,如果构造函数抛出了异常,则会回滚,释放分配的内存。

11、是否在析构函数抛出异常。不推荐这么做,最好内部消化。其次外部也不一定有catch的地方。

12、什么是面向对象。面向对象就是把编程中遇到的概念抽象为对象,整个程序运行过程中的函数调用都是对象之间的交互,每个类都有自己的属性与方法。

13、构造函数中,成员变量一定要通过初始化列表来初始化的情况。一是没有默认构造函数的类,二是const变量,三是引用。

14、#include<a.h> 与#include”a.h”的区别。前者是在编译器设置的目录里寻找,后者会现在当前文件所在目录寻找,找不到再去前者的目录寻找。

15、struct和class的区别。struct默认访问级别是public,class默认访问级别是private。

16、当一个类中没有任何成员变量和成员函数,这时sizeof(A)的A值是多少,1字节。

17、如果不是零,请解释一下编译器为什么没有让他为零。因为如果是0字节,就是没有分配内存,那么两个实例就会无法区分,系统也不知道哪里去找这个对象的地址。所以会分配1字节,用以区分两个对象。

18、面向对象是一种思想,如何使用C语言来实现。封装,就是把函数的第一个参数设置为struct指针,这样函数调用的时候,传入要调用的对象即可。继承,把第一个成员变量设为基类就可以了。因为内存是按顺序排列的,所以基类指针指向子类是没有问题的。多态,可以自己写一个虚函数指针和虚函数表,一个结构体。

19、C++有哪些数据类型,为什么long和int都是4字节。short,int,long,long long,float,double,bool,char等等。标准只规定了long的长度要大于等于int,并没有具体规定。由于之前32位系统的时候正好是个人计算机大量普及的时候,为了CPU可以一次读一个变量,所以int被设置为4字节。到了64位系统,由于编程思想的进步和兼容性考虑,int还是4字节。

20、Java和C++的区别是什么,分别用在什么场景比较好。Java没有指针,java没有多重继承。java是完全面向对象的语言,而c++由于历史包袱,可以面向对象也可以面向过程。java有自动内存管理,而c++需要手动管理内存。java没有操作符重载。java是转为中间码,跑在jvm上的;C++是转为机器码,跑在最底层的。

发表评论

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