• C/C++ 基础知识总结


    1、const、static作用
    1).const修饰局部变量为只读,其值不可修改。如果在程序中企图对const修饰的变量进行修改,那么程序就会报错。
       static修饰局部变量修改生命周期,让局部变量到程序结束,生命周期才结束。
    2).static修饰全局变量修改作用域,限定在当前文件。跨文件访问需要extern。
       const修饰全局变量除了只读以外,作用类似static。
    3).const修饰类的成员变量,表示成员常量,不能被修改,只能在对象实例化时初始化。
       static静态成员变量必须在类外定义,定义时不添加static关键字,但需要添加作用域限定符声明。
    4).const修饰函数承诺在本函数内部不会修改类内的数据成员,不会调用其它非const成员函数。非const函数可以调用const函数。
    5).如果const构成函数重载,const对象只能调用const函数,非const对象优先调用非const函数。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    2、c++面向对象三大特征(封装,继承,多态)
    封装:将数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。
    继承:让某个类型的对象获得另一个类型的对象的属性的。
    多态:允许将子类类型的指针赋值给父类类型的指针。
    
    引出多态实现原理、动态绑定、菱形继承。
    1)重写override:子类继承父类并且覆写父类中的virtual方法,动态多态。
       重定义redefining:子类继承父类并且覆写父类中的一般方法。
       重载overload:函数名相同,参数列表不同,编译器会根据参数列表,确定函数调用,静态多态/非多态。
    2)动态绑定:虚函数表
    3)菱形继承:两个子类继承同一个父类,而又有子类同时继承这两个子类,所以必须使用虚继承。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    3、虚析构的必要性
    为了能够正常调用子类的析构函数,需要将基类的析构函数设置为虚函数。
    
    • 1
    4、虚函数
    虚函数由虚函数表(C++规范并没有规定具体用哪种方法,但大部分的编译器厂商都选择此方法)管理,每个虚函数都有自己的虚函数表
    编译器保证虚函数表指针存在于对象实例中最前面的位置
    
    • 1
    • 2
    5、malloc、free和new、delete区别
    1)new/delete会执行构造析构函数
    2)malloc申请大内存
      Linux:<=128K,brk/sbrk移动堆指针; >128K mmap/munmap文件映射
    
    • 1
    • 2
    • 3
    6、vector、map、list、hashMap,vector底层,map引出红黑树。优先队列用过吗,使用的场景。无锁队列听说过吗,原理是什么(CAS)
    lock-free/wait-free
    
    • 1
    7、实现擅长的排序,说出原理(快排、堆排)
    快排
    插入
    选择
    
    • 1
    • 2
    • 3
    8、四种cast,智能指针
    static_cast:
    	用于父子类之间指针或者引用的转换,向上是安全的
    	用于基本数据类型之间的转换,安全性由程序员保证
    	用于void*转换与目标指针之间的转换,不安全
    dynamic_cast:
    	用于父子类之间指针或者引用的转换,向上是安全的,向下具有类型检查,比static_cast安全
    reinterpret_cast:
    	用于没有任何关联之间的转换 例如:指针转int,int转指针
    const_cast:
    	用于将常指针,常引用,常对象转换成非常类型
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    9、tcp和udp区别
    1).TCP面向连接, UDP面向无连接的
    2).TCP可靠性、有序性的,UDP没有(网游和视频的丢包情况)
    3).TCP是速度慢,UDP速度高快
    4).TCP是基于流的,UDP基于数据报文
    5).TCP有流量控制,UDP没有
    6).TCP连接只能是点到点、一对一的。
    7).UDP支持一对一,一对多,多对一和多对多的相互通信。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    10、进程和线程区别
    进程是操作系统资源分配的基本单位,而线程是处理器任务调度和执行的基本单位。
    进程切换会有较大的开销;线程之间切换的开销小。
    一个进程崩溃后,在保护模式下不会对其他进程产生影响,但是一个线程崩溃整个进程都死掉,
    所以多进程要比多线程健壮。
    
    • 1
    • 2
    • 3
    • 4
    11、指针和引用作用以及区别。
    引用是给已存在变量取一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。
    指针是一个用来存放内存地址的新变量。
    引用是编译器层面的,底层实现仍然是指针。
    
    • 1
    • 2
    • 3
    12、c++11 特性,auto作为返回值和模板一起怎么用,函数指针能和auto混用吗?
    13、单例、工厂模式、代理、适配器、模板,使用场景。
    14、QT信号槽实现机制,QT内存管理,MFC消息机制。
    15、进程间通信。会选一个详细问。(多线程间怎么通信?内存同步)
    进程和线程间的通信方式
    Linux进程:管道(匿名/有名)、信号、信号量、文件映射、共享内存、消息队列、套接字
    Windows进程:管道、信号量、文件映射、共享内存、消息队列、套接字、邮件槽、剪贴板
    
    内存同步:
    Linux线程:原子操作、信号量、互斥锁、读写锁、条件变量、原子锁、信号
    Windows线程:原子操作、信号量、互斥锁、临界区、事件
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    16、多线程,锁和信号量,互斥和同步。
    17、动态库和静态库的区别。
    静态库被编译到可执行程序中;动态库被编译的只是链接,执行时自动加载。
    动态库还可以通过动态加载的方式使用。
    
    • 1
    • 2
    18、虚拟内存
    说说三种内存管理机制
    页式管理:
    段式管理:
    分段分页管理:
    
    • 1
    • 2
    • 3
    • 4
    19、缓存(LRU/LFU/FIFO算法)
    FIFO:如果一个数据最先进入缓存中,则应该最早淘汰掉
    LFU:如果一个数据在最近一段时间内使用次数很少,那么在将来一段时间内被使用的可能性也很小
    LRU:如果一个数据在最近一段时间没有被访问到,那么在将来它被访问的可能性也很小
    
    LRU-K: LRU + 任意缓存算法
    2Q(LRU-2):LRU + FIFO
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    20.什么是placementNew
    placement new的作用就是:创建对象(调用该类的构造函数)但是不分配内存,而是在已有的内存块上面创建对象。
    用于需要反复创建并删除的对象上,可以降低分配释放内存的性能消耗
    
    • 1
    • 2
  • 相关阅读:
    dumi 2,它来了它来了它来了
    进程相关内容(三)
    (五)字符串——PHP
    数据结构—线性表(下)
    【知识点合辑】numpy常用函数+jupyter小用法
    项目会议如何开
    ITSS认证从申报到获得证书需要多长时间?
    Python伪随机数模块random
    垃圾分类小程序系统毕业设计,垃圾分类小程序系统设计与实现,垃圾分类系统毕设参考
    Spring Security中文文档
  • 原文地址:https://blog.csdn.net/qq_38933606/article/details/126364501