跳转至

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++程序
#include <stdio.h>

int main() {
    int a = 10, b = 20;
    int sum = a + b;
    printf("Sum = %d\n", sum);
    return 0;
}

上面的代码可以直接用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组织代码

本部分内容安排

本章后续将按照以下顺序逐一介绍这些扩展:

小节 主要内容
关键字与表达式 constautonullptr、类型检查加强
引用 引用类型、与指针的区别
范围for循环 一种新的for循环表达式
函数 函数重载、默认参数、内联函数、引用参数
枚举类型 传统枚举的问题与enum class
输入输出 cin/cout vs printf/scanf
命名空间 namespace的作用与使用方法

学习建议

学习C++扩展的三个层面

  1. 知道“有什么”:C++提供了哪些新的语法特性。
  2. 理解“为什么”:C语言原来的写法有什么问题,C++为什么这样改进。
  3. 掌握“怎么用”:在新的C++项目如何中正确使用这些特性。

从C到C++的思维转变

虽然本章内容仍是面向过程的,但它是承前启后的一章,为后续面向对象学习铺路:

  • 承接C语言:这些扩展是C++对C的增强,建立在C的基础之上。
  • 是学习面向对象的基础:后续的类、对象、继承、多态等特性,都基于这些基础语法构建。
  • 是C++全貌的起点:从本章开始,逐步构建C++的完整知识体系。

小结

  1. C++是C的超集:C++兼容C的语法,并在此基础之上扩展了新特性。

  2. C++扩展的目的:提高类型安全、增强代码复用、改善可读性和可维护性

  3. 本章内容范围:介绍C++在面向过程语法方面的增强,不涉及类、继承、多态等面向对象特性。

  4. 学习方法:通过对比C和C++的写法差异,理解每种改进的原因和价值。

在后续各节中,我们将逐一深入学习这些扩展的具体语法和使用方法。