C++面试知识点整理

C++面试知识点整理

   1、 const:const 修饰变量 其实为只读变量;只读变量为右值;const 修饰引用表示为只读变量的引用,为了语义上的统一,这样接口既能传变量也能传常量;const 修饰成员函数表示函数内不修改类数据,不会调用非const成员函数。

  2、 右值引用:右值引用绑定将亡对象,延长对象的生命周期;右值引用就是左值;std::move可以将左值转换为将亡对象;引用折叠 & + &= & 、& + &&= & 、&& + &= &、 && + &&= &&;右值引用传递时失去右性。

  3、 智能指针: unique_ptr 类似于普通指针使用,不能复制;shared_ptr 使用时引用计数加1,引用计数为0时释放内存;weak_ptr 引用计数不加,使用时转换为shared_ptr 。注意:尽量多使用make_shared代替new,好处消除      代码重复,提高异常安全,生成代码更小更快。不适用于大内存对象。

  解决make_shared代替new时的冲突方法:

  (1)使用公有构造的派生类

复制代码
 1 class Widget {
 2  public:
 3  template <typename... Args>
 4  static auto create(Args&&... args) {
 5      struct EnableMakeShared : public Widget {
 6      EnableMakeShared(Args&&... args) : Widget(std::forward<Args>    (args)...) {}
 7  };
 8     return static_pointer_cast<Widget>(
 9         make_shared<EnableMakeShared>(std::forward<Args>(args)...));
10   }
11  private:
12   Widget() = default;
13   // other constructors...
14 };
复制代码

  (2)使用Passkey惯用法

复制代码
 1 class Widget {
 2  private:
 3   struct PassKey {
 4     explicit PassKey() {}
 5   };
 6  public:
 7   template <typename... Args>
 8   explicit Widget(PassKey, Args&&... args)
 9       : Widget(std::forward<Args>(args)...) {}
10   template <typename... Args>
11   static auto create(Args&&... args) {
12     return make_shared<Widget>(PassKey{}, std::forward<Args>(args)...);
13   }
14  private:
15   Widget() = default;
16   // other constructors...
17 };
复制代码

  4、lambda 匿名函数 [ capture ] ( params ) opt -> ret { body; };其中carpture是捕获列表,params是参数,opt是选项,ret则是返回值的类型,body则是函数的具体实现。

     [] :表示不捕获任何变量

          [=]:表示按值捕获变量

          [&]:表示按引用捕获变量

          [this]:值传递捕获当前的this

  5、static :在局部变量前的static,作用域为局部函数。生命周期为main函数结束,只执行第一次初始化;在全局变量或函数前的static,作用域为当前文件,生命周期为main函数结束,对比extern修饰的作用于整个程序内;静态成员变量生命周期为main函数结束,不再跟随对象,全局只有一份,基本等价于有作用域的全局变量;静态成员函数类似于有类作用域的普通函数,可以访问类的私有成员。

  

  

  

  

  6、C11的四种类型转换 const_cast 常量指针转换为非常量指针;static_cast 强制类型转换;dynamic_cast动态类型转换;reinterpret_cast 不限制类型的转换,任意指针、任意引用之间。

  7、STL:容器分为顺序容器和关联容器;vector 时间复杂度尾部插入o(1),头部插入o(n);set和map内容不可重复且有序,数据结构为红黑树,插入、删除、查找的时间复杂度为o(log2n);unorder_set和unorder_map内容不可重复且无序,数据结构为哈希表,哈希表通过哈希函数处理关键字得到相应的关键码值,关键码值对应着一个特定的位置,用该位置来存取数据。插入、删除、查找的时间复杂度最好为o(1),最差为o(n);vector的插入、删除涉及内存拷贝和内存移动,会发生迭代器失效,set的迭代器不会失效。

     

  8、动态数组vector:vector的resize方法既可以改容器大小,也可以改内容,而reserve只能改大小;size表示已分配大小,capacity表示已分配和未分配总的大小;clear()清空内容,不清空内存,shrink_to_fit释放未使用的内存;vector适合随机访问频繁,对象小的场景,list适合对象大,插入、删除元素频繁的场景。

  9、红黑树:红黑树是一种平衡二叉树,每个节点或是红色或是黑色;根节点为黑色;如果一个节点是红色的,则他的儿子都是黑色;每个节点到其子孙节点上的所有路径上包含相同数目的黑色节点。

  10、堆栈用于动态分配内存,容量大于栈。堆上内存可以随时申请、随时分配、随时释放。要分配的大小运行时才知道,只支持动态分配内存,容易造成内存泄漏。变量可以在进程内供多个线程访问,由开发者管理内存。用于函数和局部变量、返回值,编译器自动管理释放和分配。栈上内存是连续分布的,编译器在编译时就知道要分配的内存大小。调用函数栈上分配内存,调用结束回收给栈,先入后出。栈上分配内存要快于堆。每个线程都有一个栈,栈上对象不能跨线程访问,因此栈空间较小。栈不会产生内存碎片。

  11、指针和引用的区别:指针是一个变量,存储的地址,指向内存单元,引用只是个别名;引用使用时无需解引用,指针需要解指针;引用只能在定义的时候被初始化,指针可改变指向内存地址;

  12、排序算法:选择、快速、希尔、归并、堆排;快速排序

 

posted @   王小于的啦  阅读(1155)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示