C++ 是在C基础上扩展而来(最初命名为 “C with Classes”):
C 是面向过程的结构化语言,聚焦 “如何做”
C++兼容 C 并新增面向对象(OOP)、泛型编程等范式,聚焦 “做什么”
1.核心编程范式
| 特性 | C 语言 | C++ 语言 |
|---|---|---|
| 核心范式 | 纯面向过程(结构化编程) | 兼容面向过程 + 新增面向对象(OOP)、泛型编程、函数式编程(C++11+) |
| 代码组织方式 | 以函数 / 模块为核心,通过结构体(struct)封装数据 | 以类(class)为核心,支持封装、继承、多态;可通过命名空间(namespace)隔离作用域 |
| 设计思想 | 关注 “步骤”:把问题拆分为函数调用的步骤 | 关注 “对象”:把问题拆分为相互交互的对象,对象包含数据和行为 |
2.关键语言特性差异
(1)数据封装与访问控制
C:结构体(struct)仅能封装数据,无访问控制(所有成员默认公开),无法绑定函数;
// C的结构体仅存数据
struct Student {char name[20];int age;
};
// 函数与结构体分离
void setAge(struct Student* s, int age) {s->age = age;
}
C++:类(class)封装数据和方法,支持 public/private/protected 访问控制;struct 也可包含成员函数(默认 public),本质是特殊的类;
class Student {
private: // 私有成员仅类内可访问char name[20];int age;
public: // 公有方法对外提供接口void setAge(int a) { age = a; }int getAge() { return age; }
};
(2)面向对象核心特性(C++ 独有)
| 特性 | 说明 |
|---|---|
| 继承 | 支持单继承、多继承,可通过 virtual 实现虚继承(解决菱形继承问题) |
| 多态 | 虚函数(virtual)+ 动态绑定:父类指针 / 引用可调用子类重写的方法;纯虚函数定义抽象类 |
| 构造 / 析构 | 构造函数(初始化对象)、析构函数(释放资源),支持拷贝构造、移动构造(C++11+) |
| 运算符重载 | 自定义运算符行为(如 operator+ 实现对象相加),C 仅支持内置运算符 |
class Shape {
public:virtual void draw() = 0; // 纯虚函数,抽象类
};
class Circle : public Shape {
public:void draw() override { // 重写虚函数cout << "画圆形" << endl;}
};
// 父类指针指向子类对象,调用子类方法(动态绑定)
Shape* s = new Circle();
s->draw(); // 输出:画圆形
(3)泛型编程(C++ 独有)
C++ 提供模板(template),支持编写与类型无关的通用代码(STL 核心):
函数模板:通用函数(如通用交换函数);
类模板:通用类(如 std::vector<int>、std::map<string, int>);
// 函数模板:通用交换函数
template <typename T>
void swap(T& a, T& b) {T temp = a;a = b;b = temp;
}
// 调用:支持int、float、string等任意类型
int x=1, y=2;
swap(x, y);
(4)函数增强
| 特性 | C 语言 | C++ 语言 |
|---|---|---|
| 函数重载 | 不支持(同名函数视为重复定义) | 支持(参数个数 / 类型 / 顺序不同即可) |
| 默认参数 | 不支持 | 支持(函数参数可指定默认值) |
| 内联函数(inline) | 仅作为编译器建议,效果有限 | 原生支持,减少函数调用开销 |
| 函数指针 | 支持,但语法繁琐 | 兼容,新增函数对象(仿函数)、lambda 表达式(C++11+) |
// 同名函数,参数类型不同
int add(int a, int b) { return a+b; }
double add(double a, double b) { return a+b; }
(5)内存管理
| 特性 | C 语言 | C++ 语言 |
|---|---|---|
| 动态内存 | malloc/calloc/realloc/free |
兼容 C,新增 new/delete(类型安全,可调用构造 / 析构) |
| 内存池 / 智能指针 | 无原生支持,需手动实现 | C++11+ 提供智能指针(unique_ptr/shared_ptr),自动管理内存,避免内存泄漏 |
// C++ 内存管理
int* p = new int(10); // 分配并初始化,调用构造(int是内置类型,无显式构造)
delete p; // 释放,调用析构// 智能指针(自动释放)
std::unique_ptr<int> ptr(new int(20));
(6)其他语法差异
| 特性 | C 语言 | C++ 语言 |
|---|---|---|
| 命名空间 | 无,靠前缀 / 静态变量隔离作用域 | namespace 隔离作用域,避免命名冲突(如 std::cout) |
| 异常处理 | 无,靠返回值 /setjmp/longjmp |
原生 try/catch/throw,结构化异常处理 |
| 类型检查 | 宽松(如 void* 可直接赋值给其他指针) | 严格(类型安全,隐式转换受限) |
| IO 操作 | printf/scanf(格式化,面向过程) |
cin/cout(类型安全,面向对象),兼容 C 的 IO |
| 关键字 | 32 个(如 int/struct/union) |
新增 class/virtual/template/namespace 等,总计约 90 个 |
3.编译与链接
C:编译器(如 GCC)按 C 标准(C89/C99/C11)编译,生成的目标文件符号名简单(如函数 add 对应符号 _add);
C++:编译器(如 G++)按 C++ 标准(C++98/C++11/C++20)编译,因函数重载等特性,会对符号名进行 “名字改编(Name Mangling)”(如 add(int,int) 对应 _Z3addii),因此 C++ 调用 C 函数需加 extern "C":
// C++ 中调用C函数
extern "C" {#include "c_func.h" // 导入C的头文件
}
4.适用场景
| 语言 | 核心优势 | 典型场景 |
|---|---|---|
| C | 轻量、高效、贴近硬件 | 操作系统内核、嵌入式驱动、底层协议、高性能服务器(需手动管理资源) |
| C++ | 多范式、抽象能力强、高效 | 游戏引擎、图形学、音视频处理、大型应用(如浏览器 / 数据库)、高性能计算 |
总结:
C++ 完全兼容 C 的语法和特性(大部分 C 代码可直接在 C++ 中编译),但核心差异是新增面向对象、泛型编程等高级范式,同时强化了类型安全、内存管理、代码复用能力。简单来说:
若需极致轻量、贴近硬件,选 C;
若需复杂抽象、代码复用、面向对象设计,选 C++。