C 语言和 C++ 的区别
C++ 是在 C 语言基础上发展而来的,基本完全兼容 C 语言,但在特性上有了显著扩展。首先,C++ 引入了更多关键字和语法,支持自定义命名空间,这有助于代码的组织与管理。其次,C++ 新增了类的概念,而 C 语言仅支持结构体。在访问权限方面,C++ 的 struct 默认继承和访问权限为 public,class 则默认为 private,这一设计强化了封装性。
此外,C++ 全面支持面向对象编程(OOP),包括类、封装、继承、多态、模板、重载及异常处理机制,这些是 C 语言所不具备的。在内存管理上,C 依赖 malloc/free 函数,而 C++ 除了保留这些外,还提供了更高级的 new/delete 关键字。总体而言,C 语言侧重面向过程,C++ 侧重面向对象。由于 C++ 的高级特性和对象模型,在某些场景下会引入额外的运行时开销,性能可能略低于纯 C 实现,但开发效率更高。
C++11 引入哪些新特性
C++11 标准带来了许多提升开发效率和代码安全性的新特性。最常用的是自动类型推断,通过 auto 关键字,编译器可根据初始化表达式自动推导变量类型,使代码更简洁灵活。其次是范围 for 循环,使用 for (element : container) 语法可直接遍历容器元素,无需手动编写迭代器逻辑,大幅减少了样板代码。
内存管理方面,智能指针如 std::shared_ptr 和 std::unique_ptr 被引入,它们能自动管理动态分配的内存生命周期,有效避免内存泄漏和悬挂指针问题,是现代 C++ 推荐的标准做法。
面向对象与虚函数机制
面向对象编程的核心在于类、封装、继承和多态。理解虚函数及其底层实现是面试中的高频考点。虚函数允许派生类重写基类行为,实现多态;纯虚函数则用于定义接口,强制派生类实现。
虚函数的实现依赖于虚函数表(vtable)和虚函数指针(vptr)。每个包含虚函数的类都有一个 vtable,存储虚函数地址;对象内部包含一个 vptr 指向该表。调用虚函数时,程序通过 vptr 找到对应函数地址执行。
关于构造函数和析构函数能否设为虚函数:构造函数不能是虚函数,因为对象构造前 vptr 尚未初始化,无法查表;析构函数可以是虚函数,且建议设为虚函数,以确保通过基类指针删除派生类对象时能正确调用派生类的析构函数,防止资源泄漏。
内存分配与释放细节
malloc 和 new 的主要区别在于:malloc 返回 void*,需显式转换,不调用构造函数;new 返回具体类型指针,会自动调用构造函数并分配足够内存。反之,free 只释放内存,不调用析构函数;delete 先调用析构函数再释放内存。
特别注意 delete 和 delete[] 的区别:delete 用于单个对象,delete[] 用于数组。混用会导致未定义行为,例如对数组使用 delete 可能只调用第一个元素的析构函数,造成资源泄漏或程序崩溃。在实际编码中,应严格匹配分配与释放的方式。


