一、基础语法与核心概念
-
指针与引用的区别?
-
问题:指针和引用在初始化、空值、操作方式上的差异是什么?
-
解析:
-
引用必须初始化且不能指向空值,而指针可初始化为空(
nullptr
)。 -
引用是变量的别名,操作时无需解引用(
*
),指针需解引用。 -
引用初始化后不可修改绑定对象,指针可重新指向其他对象。
-
-
答案示例:
int a = 10; int &ref = a; // 引用必须初始化 int *ptr = &a; // 指针可后续修改指向
-
-
static
关键字的作用-
问题:
static
在不同场景下的用途是什么? -
解析:
-
局部变量:延长生命周期至程序结束,作用域仍为函数内。
-
全局变量/函数:限制作用域至当前文件。
-
类成员:静态成员属于类而非对象,需类外初始化。
-
-
应用场景:计数器、共享资源管理。
-
-
const
与#define
的区别-
问题:为什么推荐使用
const
而非宏定义? -
解析:
-
类型安全:
const
有类型检查,#define
仅为文本替换。 -
调试:
const
可调试,#define
在预处理阶段已替换。 -
内存:
const
分配内存,#define
不分配。
-
-
二、面向对象与多态
-
虚函数的实现原理
-
问题:虚函数如何实现多态?虚函数表(vtable)的作用是什么?
-
解析:
-
每个含虚函数的类生成一个虚函数表,存储虚函数地址。
-
对象内部包含虚表指针(vptr),指向虚函数表。
-
动态绑定:通过vptr在运行时确定调用的函数。
-
-
代码示例:
class Base { public: virtual void func() { cout << "Base"; } }; class Derived : public Base { void func() override { cout << "Derived"; } };
-
-
构造函数能否为虚函数?
-
问题:为何构造函数不能是虚函数?
-
解析:
-
虚函数依赖虚表,而虚表在对象构造完成后才初始化。
-
构造函数用于创建对象,此时虚表尚未建立。
-
-
-
析构函数为何需要声明为虚函数?
-
问题:基类析构函数不声明为虚函数会导致什么问题?
-
解析:
-
若基类指针指向派生类对象,非虚析构会导致派生类资源未释放。
-
示例:
Base *ptr = new Derived(); delete ptr; // 若析构非虚,仅调用Base的析构函数
-
-
三、内存管理与智能指针
-
malloc
与new
的区别-
问题:动态内存分配时为何优先使用
new
? -
解析:
-
new
调用构造函数,malloc
仅分配内存。 -
delete
调用析构函数,free
直接释放内存。
-
-
代码对比:
int *p1 = (int*)malloc(sizeof(int)); // 未初始化 int *p2 = new int(10); // 初始化为10
-
-
智能指针的实现原理
-
问题:
shared_ptr
如何通过引用计数管理资源? -
解析:
-
shared_ptr
内部维护控制块,记录引用计数 -
循环引用问题:需用
weak_ptr
打破(不增加计数)
-
-
示例:
std::shared_ptr<int> sp1 = std::make_shared<int>(42); std::weak_ptr<int> wp = sp1;
-
四、STL与容器
-
vector
与deque
的区别-
问题:为何
deque
适合频繁头部操作? -
解析:
-
内存结构:
vector
为连续内存,deque
为分块链表。 -
扩容效率:
deque
无需整体复制,扩容更快。
-
-
应用场景:
vector
适合随机访问,deque
适合双端插入。
-
-
push_back
与emplace_back
的差异-
问题:为何
emplace_back
更高效? -
解析:
-
push_back
需构造临时对象再拷贝,emplace_back
直接构造。
-
-
代码示例:
std::vector<std::string> vec; vec.push_back("hello"); // 构造临时string对象 vec.emplace_back("hello"); // 直接构造,无拷贝
-
五、实战技巧与高频考点
-
如何避免野指针?
-
答案:
-
初始化指针为
nullptr
。 -
释放后立即置空:
delete ptr; ptr = nullptr;
-
-
-
内存对齐的作用 4
-
问题:为何结构体需要内存对齐?
-
解析:
-
性能优化:CPU按对齐单位读取数据,减少访问次数。
-
硬件限制:某些架构要求特定类型必须对齐。
-
-
-
【指针】:趣味指针教程 点击获取