C++ 并非 C 的一个严格超集,虽然 C++ 的设计初衷是“带类的 C”(C with Classes),并且兼容了绝大部分 C 语言的特性,但为了语言的严谨性、安全性和面向对象的设计,C++ 标准也废弃了一些 C 语言中的不安全或过时的特性。

(图片来源网络,侵删)
我们可以将 C++ 对 C 的改动和扩充分为以下几个层面:
核心思想的扩充:从“过程化”到“面向对象”
这是 C++ 最根本、最重要的扩充,C 语言是过程化的,程序由函数和数据构成,数据和操作数据的函数是分离的,而 C++ 引入了类,将数据和对数据的操作封装在一起,实现了面向对象编程。
-
封装:
class/struct:C++ 引入了class关键字,并扩展了struct的功能,使其可以包含成员函数(方法)。- 访问控制:通过
public(公有)、private(私有)、protected(保护)关键字,控制类成员的访问权限,隐藏了内部实现细节,只暴露必要的接口。 this指针:在类的成员函数中,编译器会自动传递一个指向当前对象本身的this指针。
-
继承:
(图片来源网络,侵删)允许创建一个新类(派生类/子类)来继承一个已有类(基类/父类)的属性和方法,这实现了代码的重用和层次化设计。
-
多态:
- 虚函数:通过
virtual关键字声明函数,允许在基类中定义接口,在派生类中实现不同的具体行为。 - 动态绑定:在运行时根据对象的实际类型来调用相应的函数,而不是根据指针或引用的声明类型,这是实现“同一接口,不同行为”的关键。
- 虚函数:通过
核心语言特性的扩充
在 C 语言的基础上,C++ 增加了大量的关键字和语法糖,使编程更灵活、安全和高效。
| 特性类别 | C++ 扩充内容 | 简要说明 |
|---|---|---|
| 新增关键字 | class, public, private, protected, virtual, template, namespace, new, delete, try, catch, throw, bool, true, false 等。 |
这些关键字是实现 OOP、泛型编程、异常处理等新特性的基础。 |
| 输入/输出 | iostream 库 (cin, cout, cerr) |
取代了 C 语言中 stdio.h 的 printf 和 scanf。iostream 是类型安全的、可扩展的,并且支持用户自定义类型的流插入/提取操作符重载。 |
| 内存管理 | new / delete |
提供了比 C 语言中 malloc / free 更安全的动态内存分配方式。new 会自动调用对象的构造函数,delete 会自动调用析构函数。 |
| 函数增强 | - 函数重载:允许定义多个同名函数,只要它们的参数列表(类型、个数、顺序)不同。 - 默认参数:可以为函数参数提供默认值。 - 内联函数:使用 inline 关键字建议编译器将函数代码直接插入到调用处,以消除函数调用的开销。 |
这些特性增强了函数的灵活性和效率。 |
| 作用域与命名 | - 命名空间:使用 namespace 关键字解决大型项目中命名冲突的问题。- 引用: & 符号用于声明变量的别名,是函数参数传递和返回值时更安全、更直观的选择,避免了指针的复杂性。 |
引用极大地简化了代码,尤其是在操作对象时。 |
| 错误处理 | 异常处理机制 (try, catch, throw) |
提供了一种结构化的、可扩展的错误处理方式,相比 C 语言中通过返回错误码或 setjmp/longjmp 的方式,更清晰、更安全。 |
| 布尔类型 | bool, true, false |
C 语言没有内置的布尔类型,通常用 0 和非 0 来表示假和真,C++ 引入了真正的布尔类型,使逻辑判断更清晰。 |
| 运算符重载 | 允许用户自定义运算符(如 , , <<, [])在特定类型上的行为。 |
这是 C++ 非常强大的特性,使得自定义类型的对象可以像内置类型一样自然地使用运算符,极大地提高了代码的可读性和易用性。 |
泛型编程与标准库的扩充
这是 C++ 相对于 C 的另一个革命性飞跃。

(图片来源网络,侵删)
-
模板:
- 函数模板:可以编写一个与类型无关的函数,编译器会根据实际调用时传入的类型自动生成具体的函数版本。
- 类模板:同样可以创建与类型无关的类,如
std::vector、std::list等。 - 模板是 C++ 泛型编程 的基础,允许编写“类型无关”的通用代码,极大地提高了代码的复用性。
-
标准模板库:
- C++ 引入了庞大的标准库,其中最核心的就是 STL,STL 提供了:
- 容器:如
vector(动态数组),list(链表),map(键值对),set(集合) 等。 - 算法:如
sort(排序),find(查找),copy(复制),for_each(遍历) 等。 - 迭代器:提供了一种统一的方法来遍历和访问容器中的元素,将容器和算法解耦。
- 容器:如
- 使用 STL,开发者可以避免重复“造轮子”,用更少的代码实现更复杂、更高效的功能。
- C++ 引入了庞大的标准库,其中最核心的就是 STL,STL 提供了:
C++ 废弃/修改的 C 语言特性
为了语言的严谨和安全,C++ 标准中的一些特性与 C 标准不完全一致,甚至被废弃。
void*的限制*在 C 语言中,`void` 类型的指针可以隐式转换为任何其他类型的指针,在 C++ 中,这种隐式转换被认为是不安全**的,必须通过显式类型转换(如static_cast)来完成。- 隐式函数声明:在 C 语言中,如果一个函数在使用前没有声明,编译器会默认为其返回
int类型,这是一种不安全的隐式行为,C++ 要求所有函数必须在使用前声明或定义。 - 更严格的类型检查:C++ 的类型系统比 C 更严格,C 允许将
const char*赋值给char*,而 C++ 不允许,因为这会破坏const的安全性。 - 新增关键字:C++ 中的关键字(如
new,class,template等)在 C 语言中可能是合法的标识符,用 C 编译器编译一个 C++ 程序几乎肯定会失败。
C++ 对 C 语言的扩充是革命性的,而非简单的增量式改进,它从以下几个方面彻底改变和扩展了 C 语言:
- 编程范式:从过程化升级为面向对象,引入了封装、继承、多态。
- 语言能力:增加了泛型编程能力(模板)、异常处理、命名空间、引用等现代编程语言的核心特性。
- 工具库:提供了功能强大的标准模板库,极大地提高了开发效率和代码质量。
- 安全性:通过更严格的类型检查、废弃不安全的隐式转换等方式,提升了代码的健壮性和安全性。
可以说,C++ 保留了 C 语言对底层硬件的控制能力(C++ 仍然可以用于系统级编程),同时将其提升到了一个更高层次的抽象,使其成为一门功能全面、支持多种编程范式的强大语言。
