C++常见问题 · 全文索引
c++常见问题 › C++常见问题 · 全文索引 (第 1 章)
左侧索引为多级折叠目录,可在目录里按分类展开 / 折叠。共 311 问。
引用 / 指针
- 001|引用和指针的区别?
- 002|从汇编层去解释一下引用
- 003|C++中的指针参数传递和引用参数传递
- 009|指针和 const 的用法
- 036|继承机制中对象之间如何转换?指针和引用之间如何转换?
- 058|函数指针?
- 062|野指针是什么?如何检测内存泄漏?
- 063|悬空指针和野指针有什么区别?
- 072|使用智能指针管理内存资源,RAII
- 073|手写实现智能指针类
- 104|智能指针的作用;
- 120|为什么拷贝构造函数必须传引用不能传值?
- 122|你什么情况用指针当参数,什么时候用引用,为什么?
- 126|this 指针调用成员变量时,堆栈会发生什么变化?
- 143|将“引用”作为函数参数有哪些特点?
- 144|分别写出 BOOL,int,float,指针类型的变量 a 与“零”的比较语句。
- 146|数组和指针的区别?
- 155|智能指针怎么用?智能指针出现循环引用怎么解决?
- 167|weak_ptr 如何解决 shared_ptr 循环引用
const / static / extern
- 005|static 的用法和作用?
- 007|const?
- 008|const 成员函数的理解和应用?
- 010|mutable
- 011|extern 用法?
- 081|define、const、typedef、inline 使用方法?
- 094|全局变量和 static 变量的区别
- 113|volatile 关键字的作用?
- 118|const char* 与 string 之间的关系,传递参数问题?
类与对象
- 016|虚函数可以声明为 inline 吗?
- 017|类成员初始化方式?构造函数的执行顺序 ?为什么用成员初始 化列表会快一些?
- 018|成员列表初始化?
- 019|构造函数为什么不能为虚函数?析构函数为什么要虚函数?
- 020|析构函数的作用,如何起作用?
- 021|构造函数和析构函数可以调用虚函数吗,为什么
- 022|构造函数的执行顺序?析构函数的执行顺序?构造函数内部干了 啥?拷贝构造干了啥?
- 023|虚析构函数的作用,父类的析构函数是否要设置为虚函数?
- 024|构造函数析构函数可以调用虚函数吗?
- 025|构造函数析构函数可否抛出异常
- 026|类如何实现只能静态分配和只能动态分配
- 027|如果想将某个类用作基类,为什么该类必须定义而非声明?
- 028|什么情况会自动生成默认构造函数?
- 029|什么是类的继承?
- 030|什么是组合?
- 031|抽象基类为什么不能创建对象?
- 032|类什么时候会析构?
- 033|为什么友元函数必须在类内部声明?
- 034|介绍一下 C++里面的多态?
- 035|用 C 语言实现 C++的继承
- 037|组合与继承优缺点?
- 039|移动构造函数
- 086|模板类和模板函数的区别是什么?
- 087|为什么模板类一般都是放在一个 h 文件中
- 088|C++中类成员的访问权限和继承权限问题。
- 093|C++类型转换有四种
- 095|静态成员与普通成员的区别
- 098|虚函数的内存结构,那菱形继承的虚函数内存结构呢
- 099|多继承的优缺点,作为一个开发者怎么看待多继承
- 103|在成员函数中调用 delete this 会出现什么问题?对象还可以使 用吗?
- 116|空类会默认添加哪些东西?怎么写?
- 121|空类的大小是多少?为什么?
- 124|为什么会有大端小端,htol 这一类函数的作用
- 125|静态函数能定义为虚函数吗?常函数?
- 128|设计一个类计算子类的个数
- 130|虚函数的代价?
- 131|类对象的大小
- 132|移动构造函数
- 133|何时需要合成构造函数
- 134|何时需要合成复制构造函数
- 135|何时需要成员初始化列表?过程是什么?
- 136|程序员定义的析构函数被扩展的过程?
- 137|构造函数的执行算法?
- 138|构造函数的扩展过程?
- 139|哪些函数不能是虚函数
- 147|C++如何阻止一个类被实例化?一般在什么时候将构造函数 声明为 private?
- 148|如何禁止自动生成拷贝构造函数?
- 154|虚函数与纯虚函数的区别在于
- 158|成员函数里 memset(this,0,sizeof(*this))会发生什么
- 164|noexcept 的作用、移动构造与异常安全
- 165|auto 与 decltype 的类型推导
内存与智能指针
- 048|如何在共享内存上使用 stl 标准库?
- 060|c/c++的内存分配,详细说一下栈、堆、静态存储区?
- 061|堆与栈的区别?
- 064|内存泄漏
- 065|new 和 malloc 的区别?
- 066|delete p;与 delete[]p,allocator
- 067|new 和 delete 的实现原理,delete 是如何知道释放内存的大小的 额?
- 068|malloc 申请的存储空间能用 delete 释放吗
- 069|malloc 与 free 的实现原理?
- 070|malloc、realloc、calloc 的区别
- 074|内存对齐?位域?
- 077|为什么内存对齐
- 078|函数调用过程栈的变化,返回值和参数变量哪个先入栈?
- 112|执行 int main(int argc, char *argv[])时的内存结构
- 115|查看内存的方法
- 119|new、delete、operator new、operator delete、placement new、 placement delete
- 123|大内存申请时候选用哪种?C++变量存在哪?变量的大小存 在哪?符号表存在哪?
- 159|方法调用的原理(栈,汇编)
STL / 容器
- 012|int 转字符串字符串转 int?strcat,strcpy,strncpy,memset,memcpy 的 内部实现?
- 041|vector 与 list 的区别与应用?怎么找某 vector 或者 list 的倒数第二 个元素
- 042|STL vector 的实现,删除其中的元素,迭代器如何变化?为什么 是两倍扩容?释放空间?
- 043|容器内部删除一个元素
- 044|STL 迭代器如何实现
- 045|set 与 hash_set 的区别
- 046|hashmap 与 map 的区别
- 047|map、set 是怎么实现的,红黑树是怎么能够同时实现这两种容 器? 为什么使用红黑树?
- 049|map 插入方式有几种?
- 050|STL 中 unordered_map(hash_map)和 map 的区别,hash_map 如 何解决冲突以及扩容
- 051|vector 越界访问下标,map 越界访问下标?vector 删除元素时会 不会释放空间?
- 052|map[]与 find 的区别?
- 053|STL 中 list 与 queue 之间的区别
- 054|STL 中的 allocator,deallocator
- 055|STL 中 hash_map 扩容发生什么?
- 056|map 如何创建?
- 057|vector 的增加删除都是怎么做的?为什么是 1.5 倍?
- 100|迭代器++it,it++哪个好,为什么
函数 / 模板 / 编译
- 014|C++模板是什么,底层怎么实现的?
- 040|C 语言的编译链接过程?
- 082|printf 实现原理?
- 083|#include 的顺序以及尖叫括号和双引号的区别
- 084|lambda 函数
- 085|hello world 程序开始到打印到屏幕上的全过程?
- 089|cout 和 printf 有什么区别?
- 090|重载运算符?
- 091|函数重载函数匹配原则
- 102|模板和实现可不可以不写在一个文件里面?为什么?
- 108|动态编译与静态编译
- 109|动态链接和静态链接区别
- 141|简述 strcpy、sprintf 与 memcpy 的区别
- 151|main 函数有没有返回值
- 152|写一个比较大小的模板函数
- 153|c++怎么实现一个函数先于 main 函数运行
- 161|回调函数的作用
类型系统 / 现代C++
- 097|隐式转换,如何消除隐式转换?
- 105|auto_ptr 作用
- 157|为什么要用 static_cast 转换而不用 c 语言中的转换?
- 163|constexpr、consteval、constinit 的区别与使用场景
- 166|完美转发与 std::forward 的实现
- 168|std::string_view 的使用与生命周期
- 169|C++20 Concepts 与 requires
- 170|std::span 与数组视图
其他 / 平台细节
- 004|形参与实参的区别?
- 006|静态变量什么时候初始化
- 013|深拷贝与浅拷贝?
- 015|C 语言 struct 和 C++struct 区别
- 038|左值右值
- 059|说说你对 c 和 c++的看法,c 和 c++的区别?
- 071|__stdcall 和__cdecl 的区别?
- 075|结构体变量比较是否相等
- 076|位运算
- 079|怎样判断两个浮点数是否相等?
- 080|宏定义一个取两个数中较大值的功能
- 092|定义和声明的区别
- 096|说一下理解 ifdef endif
- 101|C++如何处理多个异常的?
- 106|class、union、struct 的区别
- 107|动态联编与静态联编
- 110|在不使用额外空间的情况下,交换两个数?
- 111|strcpy 和 memcpy 的区别
- 114|讲讲大端小端,如何检测(三种方法)
- 117|标准库是什么?
- 127|静态绑定和动态绑定的介绍
- 129|怎么快速定位错误出现的地方
- 140|sizeof 和 strlen 的区别
- 142|编码实现某一变量某位清 0 或置 1
- 145|局部变量全局变量的问题?
- 149|assert 与 NDEBUGE
- 150|Denug 和 release 的区别
- 156|strcpy 函数和 strncpy 函数的区别?哪个函数更安全?
- 160|MFC 消息处理如何封装的?
- 162|随机数的生成
多线程与并发
- 200|std::thread 的创建方式有哪些?如何管理线程生命周期?
- 201|线程同步有哪几种方式?互斥锁、条件变量、信号量、屏障各自适用什么场景?
- 202|std::lock_guard 与 std::unique_lock 的区别?各自适用什么场景?
- 203|死锁的产生条件是什么?如何避免死锁?
- 204|什么是原子操作?std::atomic 的底层实现原理是什么?
- 205|C++ 内存序(memory order)有哪几种?各自语义是什么?
- 206|什么是伪共享(False Sharing)?如何用 alignas 避免?
- 207|内存屏障(Memory Barrier)是什么?它解决了什么问题?
- 208|std::async、std::future、std::promise 的使用与区别?
- 209|如何实现一个线程池?核心组件有哪些?
- 210|条件变量为什么要配合互斥锁使用?虚假唤醒是什么?如何避免?
- 211|std::mutex 有哪几种类型?recursive_mutex、timed_mutex、shared_mutex 各自适用场景?
- 212|多线程编程中,哪些操作是线程安全的?哪些不是?
- 213|std::call_once 与 std::once_flag 的作用?
- 214|如何用 C++11 实现一个线程安全的单例?
- 215|线程局部存储(thread_local)是什么?底层如何实现?
设计模式
- 216|单例模式有哪几种实现方式?懒汉与饿汉的区别?
- 217|如何实现线程安全的单例?双重检查锁定(DCLP)的问题在哪?
- 218|C++11 之后如何简化单例实现?
- 219|工厂模式有哪几种?简单工厂、工厂方法、抽象工厂的区别与适用场景?
- 220|观察者模式的核心思想是什么?如何实现一对多依赖?
- 221|职责链模式是什么?请求如何沿链传递?
- 222|策略模式与工厂模式的区别?各自适用什么场景?
- 223|装饰器模式与继承的区别?为什么优先用组合?
- 224|适配器模式的作用?类适配器与对象适配器的区别?
- 225|你在实际项目中用过哪些设计模式?解决了什么问题?
- 226|设计模式是否会导致过度设计?如何判断?
- 227|PIMPL 惯用法是什么?它解决了什么问题?
- 228|RAII 与设计模式的关系?
C++11/14/17/20 新特性
- 229|可变参数模板(Variadic Templates)是什么?如何展开参数包?
- 230|sizeof… 的作用是什么?
- 231|折叠表达式(Fold Expressions,C++17)是什么?有哪几种形式?
- 232|std::enable_if 与 SFINAE 的原理是什么?如何用它们做编译期条件选择?
- 233|std::tuple 的使用方式?如何遍历 tuple?
- 234|std::tie 在比较运算符重载中有什么妙用?
- 235|结构化绑定(Structured Bindings,C++17)怎么用?底层实现原理?
- 236|if constexpr(C++17)与普通 if 的区别?解决了什么问题?
- 237|三路比较运算符 <=>(C++20)是什么?如何自动生成比较运算符?
- 238|std::optional、std::variant、std::any 各自的使用场景?
- 239|std::function 与 lambda 的关系?std::function 的底层实现?
- 240|std::bind 与 lambda 的区别?为什么推荐用 lambda?
- 241|std::string_view 与 std::string 的区别?使用时的生命周期陷阱?
- 242|std::span 与数组视图的关系?
- 243|C++20 Concepts 与 requires 的用法?解决了什么问题?
- 244|consteval 与 constinit 的区别?各自使用场景?
- 245|模块(Modules,C++20)与头文件的区别?解决了什么问题?
- 246|协程(Coroutines,C++20)的基本概念?co_await、co_yield、co_return 的作用?
- 247|std::format(C++20)与 printf 的区别?
- 248|范围 for 循环的底层实现?如何让自定义类型支持范围 for?
- 249|初始化列表(std::initializer_list)的底层实现?
- 250|统一初始化(花括号初始化)与圆括号初始化的区别?有什么坑?
内存与底层细节补充
- 251|std::vector<bool> 为什么被诟病?底层如何存储?
- 252|对象切片(Object Slicing)是什么?什么情况下发生?如何避免?
- 253|unique_ptr 为什么不能拷贝?如何实现只能移动不能拷贝?
- 254|内存泄漏的检测方法有哪些?Valgrind、AddressSanitizer、RAII 各自原理?
- 255|BSS 段与 Data 段的区别?未初始化全局变量放在哪?
- 256|栈溢出(Stack Overflow)的常见原因?如何检测和避免?
- 257|内存池(Memory Pool)是什么?为什么需要它?
- 258|placement new 的使用场景?与普通 new 的区别?
- 259|operator new 与 new 表达式的区别?
- 260|delete 与 delete[] 的区别?对数组用错会怎样?
- 261|malloc(0) 的行为是什么?返回 NULL 还是非空指针?
- 262|calloc 与 malloc 的区别?calloc 为什么要清零?
- 263|realloc 的底层行为?原地扩容还是重新分配?
- 264|内存对齐的规则是什么?如何手动指定对齐?
- 265|位段(Bit Field)的内存布局?有什么可移植性问题?
- 266|联合体(Union)的内存布局?如何用 union 判断大小端?
- 267|空类的大小为什么是 1?空基类优化(EBO)是什么?
编译与链接补充
- 268|编译链接的全流程是什么?预处理、编译、汇编、链接各阶段做什么?
- 269|各阶段常见错误有哪些?如何区分编译错误和链接错误?
- 270|符号表(Symbol Table)是什么?存在哪里?
- 271|名字修饰(Name Mangling)是什么?C++ 如何支持函数重载?
- 272|extern “C” 的作用?为什么 C++ 调用 C 函数需要它?
- 273|static 在 C 与 C++ 中的语义差异?
- 274|内联函数与宏的区别?inline 一定能内联吗?
- 275|链接时符号冲突(Duplicate Symbol)的常见原因?
- 276|动态库与静态库的符号可见性?如何控制导出符号?
- 277|LTO(Link Time Optimization)是什么?有什么优缺点?
- 278|增量编译与全量编译的区别?如何加速编译?
C 语言特有考点补充
- 279|函数指针有哪几种类型?如何声明指向成员函数的指针?
- 280|返回函数指针的函数如何声明?
- 281|volatile 的三种典型使用场景是什么?
- 282|const 修饰指针的三种形式?如何区分?
- 283|const 修饰函数参数、返回值、成员函数分别有什么含义?
- 284|restrict 关键字的作用?(C99)
- 285|柔性数组(Flexible Array Member)是什么?如何使用?
- 286|可变参数函数(va_list、va_start、va_arg、va_end)如何实现?
- 287|setjmp 与 longjmp 的作用?有什么风险?
- 288|C 语言中的位运算有哪些常见技巧?
- 289|如何判断一个数是不是 2 的幂?
- 290|如何不用临时变量交换两个数?有什么局限?
- 291|C 语言中如何实现泛型?void* 与宏的取舍?
- 292|C 语言的内存对齐规则?如何手动控制结构体对齐?
STL 补充细节
- 293|emplace_back 与 push_back 的区别?什么时候用 emplace?
- 294|std::map 与 std::unordered_map 的选型依据?
- 295|迭代器失效的场景有哪些?vector、list、map 各自如何?
- 296|std::deque 的底层实现?与 vector 的区别?
- 297|std::priority_queue 的底层实现?如何自定义比较?
- 298|std::sort 的底层实现?为什么是混合排序?
- 299|std::stable_sort 与 std::sort 的区别?
- 300|std::accumulate 与 std::reduce 的区别?
- 301|std::for_each 与范围 for 的区别?
- 302|std::remove 与 std::erase 的区别?为什么 remove 不真正删除?
- 303|std::find 与 std::binary_search 的区别?
- 304|std::lower_bound 与 std::upper_bound 的区别?
- 305|std::transform 的使用场景?
- 306|std::shared_ptr 的引用计数是线程安全的吗?为什么?
- 307|std::make_shared 与直接 new 的区别?为什么推荐 make_shared?
- 308|std::weak_ptr 的 lock() 与 expired() 的区别?
- 309|std::enable_shared_from_this 的作用?使用场景?
- 310|std::allocator 的作用?如何自定义 allocator?
异常与错误处理补充
- 311|C++ 异常处理的底层实现机制?(栈展开、异常表)
- 312|异常安全的三个等级是什么?如何保证强异常安全?
- 313|noexcept 的作用?什么时候必须用?
- 314|移动构造与异常安全的关系?为什么移动构造通常要 noexcept?
- 315|析构函数抛出异常会怎样?为什么析构函数不应该抛异常?
- 316|throw 与 throw() 与 noexcept 的区别?
- 317|如何捕获所有异常?catch(…) 的使用场景?
- 318|异常与错误码的取舍?什么时候用异常,什么时候用错误码?
- 319|RAII 与异常安全的关系?
- 320|std::exception 的继承体系?如何自定义异常类?
其他补充
- 321|C++ 的编译期计算有哪些方式?模板元编程、constexpr、consteval 的演进?
- 322|type_traits 的常见用法?如何实现一个 is_same?
- 323|如何判断一个类型是否可拷贝、可移动?
- 324|std::decay 的作用?
- 325|std::ref 与 std::cref 的作用?为什么需要它们?
- 326|std::move 与 std::forward 的区别?各自适用场景?
- 327|万能引用(Universal Reference)与右值引用的区别?
- 328|引用折叠(Reference Collapsing)规则是什么?
- 329|返回值优化(RVO)与 NRVO 是什么?什么时候发生?
- 330|拷贝省略(Copy Elision)与移动语义的关系?
- 331|C++ 的对象模型?虚函数表、虚基类表如何布局?
- 332|多继承下指针调整(this 指针偏移)如何发生?
- 333|虚继承的内存布局?菱形继承问题如何解决?
- 334|dynamic_cast 的底层实现?为什么比 static_cast 慢?
- 335|RTTI 是什么?typeid 的使用与局限?
- 336|C++ 的 ABI 是什么?为什么不同编译器版本之间不能混用?
- 337|ODR(One Definition Rule)是什么?违反会怎样?
- 338|内联命名空间(inline namespace)的作用?
- 339|匿名命名空间与 static 的区别?
- 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/),并保留原文链接。
还没有评论,来说两句?