C++常见问题 · 全文索引

c++常见问题 › C++常见问题 · 全文索引 (第 1 章)
文章工具

左侧索引为多级折叠目录,可在目录里按分类展开 / 折叠。共 311 问。

引用 / 指针

  1. 001|引用和指针的区别?
  2. 002|从汇编层去解释一下引用
  3. 003|C++中的指针参数传递和引用参数传递
  4. 009|指针和 const 的用法
  5. 036|继承机制中对象之间如何转换?指针和引用之间如何转换?
  6. 058|函数指针?
  7. 062|野指针是什么?如何检测内存泄漏?
  8. 063|悬空指针和野指针有什么区别?
  9. 072|使用智能指针管理内存资源,RAII
  10. 073|手写实现智能指针类
  11. 104|智能指针的作用;
  12. 120|为什么拷贝构造函数必须传引用不能传值?
  13. 122|你什么情况用指针当参数,什么时候用引用,为什么?
  14. 126|this 指针调用成员变量时,堆栈会发生什么变化?
  15. 143|将“引用”作为函数参数有哪些特点?
  16. 144|分别写出 BOOL,int,float,指针类型的变量 a 与“零”的比较语句。
  17. 146|数组和指针的区别?
  18. 155|智能指针怎么用?智能指针出现循环引用怎么解决?
  19. 167|weak_ptr 如何解决 shared_ptr 循环引用

const / static / extern

  1. 005|static 的用法和作用?
  2. 007|const?
  3. 008|const 成员函数的理解和应用?
  4. 010|mutable
  5. 011|extern 用法?
  6. 081|define、const、typedef、inline 使用方法?
  7. 094|全局变量和 static 变量的区别
  8. 113|volatile 关键字的作用?
  9. 118|const char* 与 string 之间的关系,传递参数问题?

类与对象

  1. 016|虚函数可以声明为 inline 吗?
  2. 017|类成员初始化方式?构造函数的执行顺序 ?为什么用成员初始 化列表会快一些?
  3. 018|成员列表初始化?
  4. 019|构造函数为什么不能为虚函数?析构函数为什么要虚函数?
  5. 020|析构函数的作用,如何起作用?
  6. 021|构造函数和析构函数可以调用虚函数吗,为什么
  7. 022|构造函数的执行顺序?析构函数的执行顺序?构造函数内部干了 啥?拷贝构造干了啥?
  8. 023|虚析构函数的作用,父类的析构函数是否要设置为虚函数?
  9. 024|构造函数析构函数可以调用虚函数吗?
  10. 025|构造函数析构函数可否抛出异常
  11. 026|类如何实现只能静态分配和只能动态分配
  12. 027|如果想将某个类用作基类,为什么该类必须定义而非声明?
  13. 028|什么情况会自动生成默认构造函数?
  14. 029|什么是类的继承?
  15. 030|什么是组合?
  16. 031|抽象基类为什么不能创建对象?
  17. 032|类什么时候会析构?
  18. 033|为什么友元函数必须在类内部声明?
  19. 034|介绍一下 C++里面的多态?
  20. 035|用 C 语言实现 C++的继承
  21. 037|组合与继承优缺点?
  22. 039|移动构造函数
  23. 086|模板类和模板函数的区别是什么?
  24. 087|为什么模板类一般都是放在一个 h 文件中
  25. 088|C++中类成员的访问权限和继承权限问题。
  26. 093|C++类型转换有四种
  27. 095|静态成员与普通成员的区别
  28. 098|虚函数的内存结构,那菱形继承的虚函数内存结构呢
  29. 099|多继承的优缺点,作为一个开发者怎么看待多继承
  30. 103|在成员函数中调用 delete this 会出现什么问题?对象还可以使 用吗?
  31. 116|空类会默认添加哪些东西?怎么写?
  32. 121|空类的大小是多少?为什么?
  33. 124|为什么会有大端小端,htol 这一类函数的作用
  34. 125|静态函数能定义为虚函数吗?常函数?
  35. 128|设计一个类计算子类的个数
  36. 130|虚函数的代价?
  37. 131|类对象的大小
  38. 132|移动构造函数
  39. 133|何时需要合成构造函数
  40. 134|何时需要合成复制构造函数
  41. 135|何时需要成员初始化列表?过程是什么?
  42. 136|程序员定义的析构函数被扩展的过程?
  43. 137|构造函数的执行算法?
  44. 138|构造函数的扩展过程?
  45. 139|哪些函数不能是虚函数
  46. 147|C++如何阻止一个类被实例化?一般在什么时候将构造函数 声明为 private?
  47. 148|如何禁止自动生成拷贝构造函数?
  48. 154|虚函数与纯虚函数的区别在于
  49. 158|成员函数里 memset(this,0,sizeof(*this))会发生什么
  50. 164|noexcept 的作用、移动构造与异常安全
  51. 165|auto 与 decltype 的类型推导

内存与智能指针

  1. 048|如何在共享内存上使用 stl 标准库?
  2. 060|c/c++的内存分配,详细说一下栈、堆、静态存储区?
  3. 061|堆与栈的区别?
  4. 064|内存泄漏
  5. 065|new 和 malloc 的区别?
  6. 066|delete p;与 delete[]p,allocator
  7. 067|new 和 delete 的实现原理,delete 是如何知道释放内存的大小的 额?
  8. 068|malloc 申请的存储空间能用 delete 释放吗
  9. 069|malloc 与 free 的实现原理?
  10. 070|malloc、realloc、calloc 的区别
  11. 074|内存对齐?位域?
  12. 077|为什么内存对齐
  13. 078|函数调用过程栈的变化,返回值和参数变量哪个先入栈?
  14. 112|执行 int main(int argc, char *argv[])时的内存结构
  15. 115|查看内存的方法
  16. 119|new、delete、operator new、operator delete、placement new、 placement delete
  17. 123|大内存申请时候选用哪种?C++变量存在哪?变量的大小存 在哪?符号表存在哪?
  18. 159|方法调用的原理(栈,汇编)

STL / 容器

  1. 012|int 转字符串字符串转 int?strcat,strcpy,strncpy,memset,memcpy 的 内部实现?
  2. 041|vector 与 list 的区别与应用?怎么找某 vector 或者 list 的倒数第二 个元素
  3. 042|STL vector 的实现,删除其中的元素,迭代器如何变化?为什么 是两倍扩容?释放空间?
  4. 043|容器内部删除一个元素
  5. 044|STL 迭代器如何实现
  6. 045|set 与 hash_set 的区别
  7. 046|hashmap 与 map 的区别
  8. 047|map、set 是怎么实现的,红黑树是怎么能够同时实现这两种容 器? 为什么使用红黑树?
  9. 049|map 插入方式有几种?
  10. 050|STL 中 unordered_map(hash_map)和 map 的区别,hash_map 如 何解决冲突以及扩容
  11. 051|vector 越界访问下标,map 越界访问下标?vector 删除元素时会 不会释放空间?
  12. 052|map[]与 find 的区别?
  13. 053|STL 中 list 与 queue 之间的区别
  14. 054|STL 中的 allocator,deallocator
  15. 055|STL 中 hash_map 扩容发生什么?
  16. 056|map 如何创建?
  17. 057|vector 的增加删除都是怎么做的?为什么是 1.5 倍?
  18. 100|迭代器++it,it++哪个好,为什么

函数 / 模板 / 编译

  1. 014|C++模板是什么,底层怎么实现的?
  2. 040|C 语言的编译链接过程?
  3. 082|printf 实现原理?
  4. 083|#include 的顺序以及尖叫括号和双引号的区别
  5. 084|lambda 函数
  6. 085|hello world 程序开始到打印到屏幕上的全过程?
  7. 089|cout 和 printf 有什么区别?
  8. 090|重载运算符?
  9. 091|函数重载函数匹配原则
  10. 102|模板和实现可不可以不写在一个文件里面?为什么?
  11. 108|动态编译与静态编译
  12. 109|动态链接和静态链接区别
  13. 141|简述 strcpy、sprintf 与 memcpy 的区别
  14. 151|main 函数有没有返回值
  15. 152|写一个比较大小的模板函数
  16. 153|c++怎么实现一个函数先于 main 函数运行
  17. 161|回调函数的作用

类型系统 / 现代C++

  1. 097|隐式转换,如何消除隐式转换?
  2. 105|auto_ptr 作用
  3. 157|为什么要用 static_cast 转换而不用 c 语言中的转换?
  4. 163|constexpr、consteval、constinit 的区别与使用场景
  5. 166|完美转发与 std::forward 的实现
  6. 168|std::string_view 的使用与生命周期
  7. 169|C++20 Concepts 与 requires
  8. 170|std::span 与数组视图

其他 / 平台细节

  1. 004|形参与实参的区别?
  2. 006|静态变量什么时候初始化
  3. 013|深拷贝与浅拷贝?
  4. 015|C 语言 struct 和 C++struct 区别
  5. 038|左值右值
  6. 059|说说你对 c 和 c++的看法,c 和 c++的区别?
  7. 071|__stdcall 和__cdecl 的区别?
  8. 075|结构体变量比较是否相等
  9. 076|位运算
  10. 079|怎样判断两个浮点数是否相等?
  11. 080|宏定义一个取两个数中较大值的功能
  12. 092|定义和声明的区别
  13. 096|说一下理解 ifdef endif
  14. 101|C++如何处理多个异常的?
  15. 106|class、union、struct 的区别
  16. 107|动态联编与静态联编
  17. 110|在不使用额外空间的情况下,交换两个数?
  18. 111|strcpy 和 memcpy 的区别
  19. 114|讲讲大端小端,如何检测(三种方法)
  20. 117|标准库是什么?
  21. 127|静态绑定和动态绑定的介绍
  22. 129|怎么快速定位错误出现的地方
  23. 140|sizeof 和 strlen 的区别
  24. 142|编码实现某一变量某位清 0 或置 1
  25. 145|局部变量全局变量的问题?
  26. 149|assert 与 NDEBUGE
  27. 150|Denug 和 release 的区别
  28. 156|strcpy 函数和 strncpy 函数的区别?哪个函数更安全?
  29. 160|MFC 消息处理如何封装的?
  30. 162|随机数的生成

多线程与并发

  1. 200|std::thread 的创建方式有哪些?如何管理线程生命周期?
  2. 201|线程同步有哪几种方式?互斥锁、条件变量、信号量、屏障各自适用什么场景?
  3. 202|std::lock_guard 与 std::unique_lock 的区别?各自适用什么场景?
  4. 203|死锁的产生条件是什么?如何避免死锁?
  5. 204|什么是原子操作?std::atomic 的底层实现原理是什么?
  6. 205|C++ 内存序(memory order)有哪几种?各自语义是什么?
  7. 206|什么是伪共享(False Sharing)?如何用 alignas 避免?
  8. 207|内存屏障(Memory Barrier)是什么?它解决了什么问题?
  9. 208|std::async、std::future、std::promise 的使用与区别?
  10. 209|如何实现一个线程池?核心组件有哪些?
  11. 210|条件变量为什么要配合互斥锁使用?虚假唤醒是什么?如何避免?
  12. 211|std::mutex 有哪几种类型?recursive_mutex、timed_mutex、shared_mutex 各自适用场景?
  13. 212|多线程编程中,哪些操作是线程安全的?哪些不是?
  14. 213|std::call_once 与 std::once_flag 的作用?
  15. 214|如何用 C++11 实现一个线程安全的单例?
  16. 215|线程局部存储(thread_local)是什么?底层如何实现?

设计模式

  1. 216|单例模式有哪几种实现方式?懒汉与饿汉的区别?
  2. 217|如何实现线程安全的单例?双重检查锁定(DCLP)的问题在哪?
  3. 218|C++11 之后如何简化单例实现?
  4. 219|工厂模式有哪几种?简单工厂、工厂方法、抽象工厂的区别与适用场景?
  5. 220|观察者模式的核心思想是什么?如何实现一对多依赖?
  6. 221|职责链模式是什么?请求如何沿链传递?
  7. 222|策略模式与工厂模式的区别?各自适用什么场景?
  8. 223|装饰器模式与继承的区别?为什么优先用组合?
  9. 224|适配器模式的作用?类适配器与对象适配器的区别?
  10. 225|你在实际项目中用过哪些设计模式?解决了什么问题?
  11. 226|设计模式是否会导致过度设计?如何判断?
  12. 227|PIMPL 惯用法是什么?它解决了什么问题?
  13. 228|RAII 与设计模式的关系?

C++11/14/17/20 新特性

  1. 229|可变参数模板(Variadic Templates)是什么?如何展开参数包?
  2. 230|sizeof… 的作用是什么?
  3. 231|折叠表达式(Fold Expressions,C++17)是什么?有哪几种形式?
  4. 232|std::enable_if 与 SFINAE 的原理是什么?如何用它们做编译期条件选择?
  5. 233|std::tuple 的使用方式?如何遍历 tuple?
  6. 234|std::tie 在比较运算符重载中有什么妙用?
  7. 235|结构化绑定(Structured Bindings,C++17)怎么用?底层实现原理?
  8. 236|if constexpr(C++17)与普通 if 的区别?解决了什么问题?
  9. 237|三路比较运算符 <=>(C++20)是什么?如何自动生成比较运算符?
  10. 238|std::optional、std::variant、std::any 各自的使用场景?
  11. 239|std::function 与 lambda 的关系?std::function 的底层实现?
  12. 240|std::bind 与 lambda 的区别?为什么推荐用 lambda?
  13. 241|std::string_view 与 std::string 的区别?使用时的生命周期陷阱?
  14. 242|std::span 与数组视图的关系?
  15. 243|C++20 Concepts 与 requires 的用法?解决了什么问题?
  16. 244|consteval 与 constinit 的区别?各自使用场景?
  17. 245|模块(Modules,C++20)与头文件的区别?解决了什么问题?
  18. 246|协程(Coroutines,C++20)的基本概念?co_await、co_yield、co_return 的作用?
  19. 247|std::format(C++20)与 printf 的区别?
  20. 248|范围 for 循环的底层实现?如何让自定义类型支持范围 for?
  21. 249|初始化列表(std::initializer_list)的底层实现?
  22. 250|统一初始化(花括号初始化)与圆括号初始化的区别?有什么坑?

内存与底层细节补充

  1. 251|std::vector<bool> 为什么被诟病?底层如何存储?
  2. 252|对象切片(Object Slicing)是什么?什么情况下发生?如何避免?
  3. 253|unique_ptr 为什么不能拷贝?如何实现只能移动不能拷贝?
  4. 254|内存泄漏的检测方法有哪些?Valgrind、AddressSanitizer、RAII 各自原理?
  5. 255|BSS 段与 Data 段的区别?未初始化全局变量放在哪?
  6. 256|栈溢出(Stack Overflow)的常见原因?如何检测和避免?
  7. 257|内存池(Memory Pool)是什么?为什么需要它?
  8. 258|placement new 的使用场景?与普通 new 的区别?
  9. 259|operator new 与 new 表达式的区别?
  10. 260|delete 与 delete[] 的区别?对数组用错会怎样?
  11. 261|malloc(0) 的行为是什么?返回 NULL 还是非空指针?
  12. 262|calloc 与 malloc 的区别?calloc 为什么要清零?
  13. 263|realloc 的底层行为?原地扩容还是重新分配?
  14. 264|内存对齐的规则是什么?如何手动指定对齐?
  15. 265|位段(Bit Field)的内存布局?有什么可移植性问题?
  16. 266|联合体(Union)的内存布局?如何用 union 判断大小端?
  17. 267|空类的大小为什么是 1?空基类优化(EBO)是什么?

编译与链接补充

  1. 268|编译链接的全流程是什么?预处理、编译、汇编、链接各阶段做什么?
  2. 269|各阶段常见错误有哪些?如何区分编译错误和链接错误?
  3. 270|符号表(Symbol Table)是什么?存在哪里?
  4. 271|名字修饰(Name Mangling)是什么?C++ 如何支持函数重载?
  5. 272|extern &#8220;C&#8221; 的作用?为什么 C++ 调用 C 函数需要它?
  6. 273|static 在 C 与 C++ 中的语义差异?
  7. 274|内联函数与宏的区别?inline 一定能内联吗?
  8. 275|链接时符号冲突(Duplicate Symbol)的常见原因?
  9. 276|动态库与静态库的符号可见性?如何控制导出符号?
  10. 277|LTO(Link Time Optimization)是什么?有什么优缺点?
  11. 278|增量编译与全量编译的区别?如何加速编译?

C 语言特有考点补充

  1. 279|函数指针有哪几种类型?如何声明指向成员函数的指针?
  2. 280|返回函数指针的函数如何声明?
  3. 281|volatile 的三种典型使用场景是什么?
  4. 282|const 修饰指针的三种形式?如何区分?
  5. 283|const 修饰函数参数、返回值、成员函数分别有什么含义?
  6. 284|restrict 关键字的作用?(C99)
  7. 285|柔性数组(Flexible Array Member)是什么?如何使用?
  8. 286|可变参数函数(va_list、va_start、va_arg、va_end)如何实现?
  9. 287|setjmp 与 longjmp 的作用?有什么风险?
  10. 288|C 语言中的位运算有哪些常见技巧?
  11. 289|如何判断一个数是不是 2 的幂?
  12. 290|如何不用临时变量交换两个数?有什么局限?
  13. 291|C 语言中如何实现泛型?void* 与宏的取舍?
  14. 292|C 语言的内存对齐规则?如何手动控制结构体对齐?

STL 补充细节

  1. 293|emplace_back 与 push_back 的区别?什么时候用 emplace?
  2. 294|std::map 与 std::unordered_map 的选型依据?
  3. 295|迭代器失效的场景有哪些?vector、list、map 各自如何?
  4. 296|std::deque 的底层实现?与 vector 的区别?
  5. 297|std::priority_queue 的底层实现?如何自定义比较?
  6. 298|std::sort 的底层实现?为什么是混合排序?
  7. 299|std::stable_sort 与 std::sort 的区别?
  8. 300|std::accumulate 与 std::reduce 的区别?
  9. 301|std::for_each 与范围 for 的区别?
  10. 302|std::remove 与 std::erase 的区别?为什么 remove 不真正删除?
  11. 303|std::find 与 std::binary_search 的区别?
  12. 304|std::lower_bound 与 std::upper_bound 的区别?
  13. 305|std::transform 的使用场景?
  14. 306|std::shared_ptr 的引用计数是线程安全的吗?为什么?
  15. 307|std::make_shared 与直接 new 的区别?为什么推荐 make_shared?
  16. 308|std::weak_ptr 的 lock() 与 expired() 的区别?
  17. 309|std::enable_shared_from_this 的作用?使用场景?
  18. 310|std::allocator 的作用?如何自定义 allocator?

异常与错误处理补充

  1. 311|C++ 异常处理的底层实现机制?(栈展开、异常表)
  2. 312|异常安全的三个等级是什么?如何保证强异常安全?
  3. 313|noexcept 的作用?什么时候必须用?
  4. 314|移动构造与异常安全的关系?为什么移动构造通常要 noexcept?
  5. 315|析构函数抛出异常会怎样?为什么析构函数不应该抛异常?
  6. 316|throw 与 throw() 与 noexcept 的区别?
  7. 317|如何捕获所有异常?catch(&#8230;) 的使用场景?
  8. 318|异常与错误码的取舍?什么时候用异常,什么时候用错误码?
  9. 319|RAII 与异常安全的关系?
  10. 320|std::exception 的继承体系?如何自定义异常类?

其他补充

  1. 321|C++ 的编译期计算有哪些方式?模板元编程、constexpr、consteval 的演进?
  2. 322|type_traits 的常见用法?如何实现一个 is_same?
  3. 323|如何判断一个类型是否可拷贝、可移动?
  4. 324|std::decay 的作用?
  5. 325|std::ref 与 std::cref 的作用?为什么需要它们?
  6. 326|std::move 与 std::forward 的区别?各自适用场景?
  7. 327|万能引用(Universal Reference)与右值引用的区别?
  8. 328|引用折叠(Reference Collapsing)规则是什么?
  9. 329|返回值优化(RVO)与 NRVO 是什么?什么时候发生?
  10. 330|拷贝省略(Copy Elision)与移动语义的关系?
  11. 331|C++ 的对象模型?虚函数表、虚基类表如何布局?
  12. 332|多继承下指针调整(this 指针偏移)如何发生?
  13. 333|虚继承的内存布局?菱形继承问题如何解决?
  14. 334|dynamic_cast 的底层实现?为什么比 static_cast 慢?
  15. 335|RTTI 是什么?typeid 的使用与局限?
  16. 336|C++ 的 ABI 是什么?为什么不同编译器版本之间不能混用?
  17. 337|ODR(One Definition Rule)是什么?违反会怎样?
  18. 338|内联命名空间(inline namespace)的作用?
  19. 339|匿名命名空间与 static 的区别?
  20. 340|C++ 的 name lookup 规则?ADL(Argument-Dependent Lookup)是什么?

⚠️ 版权声明

本文为免费文章,欢迎转载。转载请注明出处:一木科技(https://www.pingquan.vip/2026/10/13/cpp%e5%b8%b8%e8%a7%81%e9%97%ae%e9%a2%98-%e5%85%a8%e6%96%87%e7%b4%a2%e5%bc%95/),并保留原文链接。