C++对C的扩展概述¶
在正式学习 C++ 面向对象程序设计之前,我们需要先了解 C++ 与 C 语言的关系, 以及 C++ 在面向过程编程方面对 C 做了哪些增强。这有助于后续从 C 语言平稳过渡到 C++。
C++与C的关系:兼容与超越¶
C++是C的超集¶
C++起源于对C语言的扩展,最初被称为“C with Classes”(带类的C)。它基本保留了C语言的所有语法和功能,在此基础之上增加了新的特性。
- 语法兼容:绝大多数合法的C程序也是合法的C++程序。
- C++是C的超集:C++包含了C的全部语法,并在此基础上进行了扩展。
- 设计目标不同:C专注于系统编程和底层操作,C++在保持高性能的同时支持面向对象和泛型编程。
一个简单的例子
上面的代码可以直接用C++编译器编译运行,体现了C++对C的兼容性。
为什么需要扩展¶
C语言虽然强大,但在大型软件开发中存在一些不足。C++的扩展正是为了解决这些问题:
C语言的主要局限与C++的改进方向
| C语言的局限 | C++的改进 |
|---|---|
类型检查较弱:函数原型不强制,void*可任意转换 |
更严格的类型检查:函数必须声明原型,void*不能隐式转换 |
| 全局命名空间污染:所有函数和变量都在同一作用域 | 命名空间:将代码组织到不同命名空间,避免名称冲突 |
| 代码复用困难:只能通过函数和宏实现复用 | 函数重载:同名函数支持不同参数类型 |
宏的不安全性:#define宏缺乏类型检查 |
内联函数、const常量、constexpr替代宏 |
枚举类型不安全:枚举值暴露在全局作用域,可隐式转换为int |
enum class:强类型枚举,限定作用域 |
手动内存管理繁琐:malloc/free不调用构造/析构,需手动计算大小 |
new/delete:自动计算大小,类型安全 |
输入输出不便:printf/scanf需要格式字符串匹配 |
cin/cout:类型安全,可链式调用 |
C++之父的话
C++的设计目标是:
“让程序员能够用更高级的方式思考和解决问题,同时不牺牲性能,并能与C语言代码无缝协作。” —— Bjarne Stroustrup
两种编译器:C与C++的分野¶
在学习时需要注意,尽管C++兼容C的语法,但C编译器和C++编译器是不同的:
| 对比项 | C编译器(如gcc) | C++编译器(如g++) |
|---|---|---|
| 编译的文件扩展名 | .c |
.cpp、.cc、.cxx |
| 是否支持C++特性 | 不支持(或有限支持) | 完全支持 |
| 常见使用场景 | 纯C项目、底层系统 | C++项目、混合项目 |
C++在面向过程方面的主要扩展¶
本课程的重点是C++面向对象的特性,但在进入类和对象之前,需要先了解C++对C的基础语法扩展。这些扩展涉及C语言中已有的面向过程语法,但使用起来更安全、更方便。
C++面向过程扩展要点
| 扩展内容 | C语言的写法 | C++的改进 |
|---|---|---|
| 变量声明与作用域 | 所有变量必须在块开头声明 | 可在任意位置声明,就近声明 |
| 常量 | #define宏 |
const关键字,类型安全 |
| 空指针 | NULL宏(类型不明确) |
nullptr关键字,类型安全 |
| 类型推导 | 必须显式声明类型 | auto自动推导,decltype |
| 枚举 | enum(值暴露在全局作用域) |
enum class(限定作用域,类型安全) |
| 函数重载 | 不支持,需不同函数名 | 支持,同名不同参 |
| 默认参数 | 不支持 | 支持,方便扩展 |
| 内联函数 | 不支持,依赖宏 | inline关键字,类型安全 |
| 引用 | 只有指针 | 引用&,更简洁安全 |
| 动态内存 | malloc/free,需手动计算,类型不安全 |
new/delete,自动计算,类型安全 |
| 输入输出 | printf/scanf,格式字符串不匹配易出错 |
cin/cout,类型安全 |
| 作用域控制 | 全局命名空间污染 | namespace组织代码 |
本部分内容安排¶
本章后续将按照以下顺序逐一介绍这些扩展:
| 小节 | 主要内容 |
|---|---|
| 关键字与表达式 | const、auto、nullptr、类型检查加强 |
| 引用 | 引用类型、与指针的区别 |
| 范围for循环 | 一种新的for循环表达式 |
| 函数 | 函数重载、默认参数、内联函数、引用参数 |
| 枚举类型 | 传统枚举的问题与enum class |
| 输入输出 | cin/cout vs printf/scanf |
| 命名空间 | namespace的作用与使用方法 |
学习建议¶
学习C++扩展的三个层面
- 知道“有什么”:C++提供了哪些新的语法特性。
- 理解“为什么”:C语言原来的写法有什么问题,C++为什么这样改进。
- 掌握“怎么用”:在新的C++项目如何中正确使用这些特性。
从C到C++的思维转变¶
虽然本章内容仍是面向过程的,但它是承前启后的一章,为后续面向对象学习铺路:
- 承接C语言:这些扩展是C++对C的增强,建立在C的基础之上。
- 是学习面向对象的基础:后续的类、对象、继承、多态等特性,都基于这些基础语法构建。
- 是C++全貌的起点:从本章开始,逐步构建C++的完整知识体系。
小结¶
-
C++是C的超集:C++兼容C的语法,并在此基础之上扩展了新特性。
-
C++扩展的目的:提高类型安全、增强代码复用、改善可读性和可维护性。
-
本章内容范围:介绍C++在面向过程语法方面的增强,不涉及类、继承、多态等面向对象特性。
-
学习方法:通过对比C和C++的写法差异,理解每种改进的原因和价值。
在后续各节中,我们将逐一深入学习这些扩展的具体语法和使用方法。