第一课 C 与 C++ 互联网新技术在线教育领航者 1
内容概述 第一部分 : C++ 综述 1. C++ 历史背景 2. Why C++ 3. 推荐书籍第二部分 : C VS C++ 1. C 语法回顾 2. 例 :C 实现动态数组 3. C++ 的 vector 第三部分 :C++ 对 C 的扩展 ( 上 ) 1. 命名空间 2. 输入输出 3. 基本类型转换 4. 声明 列表初始化 5. 指针和引用 6. const 限定符 7. struct 和 class 8. string 和 vector 9. 练习 : 进制转换 互联网新技术在线教育领航者 2
C++ 历史背景 1982 年, 美国 AT&T 公司贝尔实验室的 Bjarne Stroustrup( 本贾尼 ) 博士在 C 语言的基础上引入并扩充了面向对象的概念, 发明了 种新的程序语言, 被命名为 C++ C++ 发展的几个阶段 : 第一阶段 ( 从 80 年代到 1995 年 ): 这一阶段 C++ 语言基本上是传统类型上的面向对象语言, 凭借着接近 C 语言的效率, 在开发语言中占据了很大份额 ; 第二阶段 ( 从 1995 年到 2000 年 ): 这一阶段由于标准模板库 (STL) 等程序库的出现, 泛型程序设计在 C++ 中占据了越来越多的比重性 当然, 同时由于 Java 等语言的出现和硬件价格的大规模下降,C++ 受到了一定的冲击 ; 第三阶段从 2000 年至今, 由于以 Loki MPL 等程序库为代表的产生式编程和模板元编程的出现,C++ 出现了发展历史上又一个新的高峰, 这些新技术的出现以及和原有技术的融合, 使 C++ 已经成为当今主流程序设计语言中最复杂的一员 互联网新技术在线教育领航者 3
C 与 C++ 的区别 C 语言 :C 语言诞生得非常早 (70 年代 ),C 语言的目标就是比汇编方便易用, 同时不要损失汇编的表达能力 所以 C 语言可以看成是 高级的汇编 语言 C 的特点, 简单容易编译, 灵活贴近底层 所以一直到现在, 一些需要直接和硬件打交道的软件都还是用 C 语言写的, 比如 ( 但不限于 )Linux Kernel 和一些嵌入式领域 C++ 语言 :C++ 早期是基于 C 的 C++ 的目标是提高编程人员的生产效率 而提高编程人员生产率的方法有如下几种 : 提高抽象层次, 支持模块化编程, 模块内紧耦合, 模块间松耦合, 自动化的代码生成等等, 在 C++ 中可以比 C 更直接更自然地做到这些 面向对象只是 C++ 的一部分, 现代的 C++ 的目标是支持多种编程范型, 同时并不会离硬件太远 所以 C++ 是非常适合写一些基础架构级软件的, 比如编译器,GUI 库等等 互联网新技术在线教育领航者 4
C++ 内容 C++ 兼容 C ++ 的内容 : C++ 对 C 语法的扩展面向对象模板和 STL 应用领域 ( 效率 建模和高度抽象 ) 系统层软件 服务器程序 云计算 分布式 游戏 互联网新技术在线教育领航者 5
C++ 书籍 C++ Primer 第 5 版 Effective C++ 互联网新技术在线教育领航者 6
C 语法回顾 基本类型 :int char float double 输入输出 :scanf printf 基本语句 :for,while,switch case,if else 数组 :int arr[ ] 字符串 :char str[ ] 指针 :int *p 内存分配 :malloc 和 free 函数 :function 结构体 :struct 文件操作 :FILE 互联网新技术在线教育领航者 7
C 实现动态数组 存储学生信息, 要求顺序存储可逐个添加信息, 减少内存浪费 互联网新技术在线教育领航者 8
C++ 的 vector 使用 C++ 中的标准库类型 vector 可以很轻松地完成任务 ( 不需要自己管理内存的分配 ) ( 对不同的类型, 都可处理 ) 使用 C++ 中的标准库类型 string 替代 C 中的字符数组, 编程更自如 互联网新技术在线教育领航者 9
C++ 对 C 的扩展 ( 命名空间 : 作用域 ) 作用域 : 变量都有其作用域全局变量 :( 全局 ) 局部变量 :( 函数内部或 { } 内 ) 相同作用域中, 同名变量只可定义一次不同作用域中, 同名变量可重复定义, 只有新定义的起作用 实际上, 不同作用域的同名变量所占有的内存空间是不同的 互联网新技术在线教育领航者 10
C++ 对 C 的扩展 ( 命名空间 : 引入原因 ) 引入原因 : 在大中型项目开发过程中, 经常会用到多家公司提供的类库, 或者协作开发的多个小组之间, 可能会使用同名的函数或者全局变量, 从而造成冲突 命名空间, 是为了解决这种命名冲突而引入的一种机制 C 语言中没有该机制 C++ 语言中引入了该机制 互联网新技术在线教育领航者 11
C++ 对 C 的扩展 ( 命名空间 : 基本语法 ) 基本语法 : namespace 空间名字 { 变量 ; 函数 ; } ( 注意, 此处没有分号 ) 基本用法 : 空间名字 :: 变量名 / 函数名 命名空间分割了全局命名空间 (::) 每个命名空间都是一个作用域 互联网新技术在线教育领航者 12
C++ 对 C 的扩展 ( 命名空间 : 使用方法 ) 使用用法 1. 空间名字 :: 变量名 / 函数名 2. using 空间名字 :: 变量名 / 函数名 ; 3. using namespace 空间名字 ; 第 2 种用法每次只能引入一个成员 ; 第 3 种用法会打开该空间中所有的成员 ( 变量 / 函数等 ), 谨慎使用 互联网新技术在线教育领航者 13
C++ 对 C 的扩展 ( 命名空间 : 使用例子 ) 在实际使用中 : 要避免二义性错误 直接使用空间名字 :: 变量 / 函数的写法是最保险的 当然, 出现这样的错误, 编译器会提醒你 互联网新技术在线教育领航者 14
C++ 对 C 的扩展 ( 命名空间 : 嵌套 不连续 ) 命名空间支持嵌套 命名空间可以是不连续的, 同名空间自动合并 不要把 #include 放在命名空间内部 互联网新技术在线教育领航者 15
C++ 对 C 的扩展 ( 命名空间 : 实际应用 ) 起别名 ( 方便书写 ) namespace TV=myTelev.; 平时常用的命名空间成员的 using 声明写在一个头文件中, 方便使用 ( 如 :using std::cout;) 互联网新技术在线教育领航者 16
C++ 对 C 的扩展 ( 输入输出 ) C++( 头文件 #include <iostream>) C( 头文件 #include <stdio.h>) cin 标准输入 键盘 scanf cout 标准输出 屏幕 printf cerr 标准错误输出 屏幕 fprintf(stderr, ) cin 和 cout 是 C++ 的标准输入流和标准输出流 在头文件 <iostream> 中定义 需要使用命名空间 std std::cin std::cout std::endl ( 推荐用法 ) 或者 using std::cin; using std::cout; using std::endl; 或者 using namespace std; ( 为了演示方便, 使用该方法 ) 互联网新技术在线教育领航者 17
C++ 对 C 的扩展 ( 输入输出 : 格式化 ) 互联网新技术在线教育领航者 18
C++ 对 C 的扩展 ( 输入输出 : 字符串 ) 互联网新技术在线教育领航者 19
C++ 对 C 的扩展 ( 数据类型 : 基本内置类型 ) 类型 含义 一般尺寸 整形 int 整形 4 字节 char 字符 1 字节 bool 布尔类型 1 字节 浮点型 float 单精度浮点数 6 位有效数字 double 双精度浮点数 10 位有效数字 bool 类型是 C++ 新增的 bool 类型的取值是 true( 真 ),false( 假 ) 常用的数据类型 : unsigned int short, unsigned short long, unsigned long long long, unsigned long long 互联网新技术在线教育领航者 20
C++ 对 C 的扩展 ( 数据类型 : 基本类型转换 ) 互联网新技术在线教育领航者 21
C++ 对 C 的扩展 ( 数据类型 :unsigned 注意 ) 互联网新技术在线教育领航者 22
C++ 对 C 的扩展 ( 数据类型 : 声明 列表初始化 ) 互联网新技术在线教育领航者 23
C++ 对 C 的扩展 ( 数据类型 : 指针和引用 ) 指针实际上是地址, 指针变量用来存放指针 ( 地址 ) 指针变量也是一种变量, 同样要占用一定的存储空间 指针的存储空间存放的是一个地址 引用是给变量或对象起一个别名 定义时必须初始化, 一旦绑定, 终身不变 引用并不占用存储空间 互联网新技术在线教育领航者 24
C++ 对 C 的扩展 ( 数据类型 : 引用 ) 引用是给变量或对象起一个别名 定义时必须初始化, 初始化是为了将该引用与它引用的变量或对象绑定, 一旦绑定, 该引用无法再重新绑定别的变量或对象 引用并不占用存储空间 互联网新技术在线教育领航者 25
C++ 对 C 的扩展 ( 数据类型 : 引用 ) 数组的引用 : 引用的本质 : 从下面的代码, 可以猜测, 引用好像就是个指针 通过汇编代码的分析, 可以推测引用实际上是通过指针来实现的 引用是指针的一种包装 : 类似 int * const p 这样的格式的一种包装 互联网新技术在线教育领航者 26
C++ 对 C 的扩展 ( 数据类型 :const 限定符 1) C++ 增强了对类型的限制 const 限定符在 C++ 编程中会经常用到 const int i = 10; // 编译时初始化 const int i = get_size(); // 运行时初始化 int j = 20; const int i = j; // 用来初始化的值是否常量无关紧要 默认情况下 :const 对象仅在文件内有效 假如要在多个文件中生效, 则 const 变量不管是声明还是定义, 都加上 extern 关键字 互联网新技术在线教育领航者 27
C++ 对 C 的扩展 ( 数据类型 :const 限定符 2) 互联网新技术在线教育领航者 28
C++ 对 C 的扩展 ( 数据类型 :struct 和 class) 结构体是一种自定义数据类型 标准 C 中的结构体是不允许包含成员函数 C 语言结构体中可通过函数指针的方式加函数 C++ 中的结构体对此进行了扩展 互联网新技术在线教育领航者 29
C++ 对 C 的扩展 ( 数据类型 : 字符串 ) 互联网新技术在线教育领航者 30
C++ 对 C 的扩展 ( 数据类型 :vector) 标准库类型 vector 表示对象的集合, 其中所有的对象的类型必须相同 因为 vector 容纳着 其他对象, 所以被称为 容器 vector 是一个类模板 互联网新技术在线教育领航者 31
C++ 对 C 的扩展 (auto 类型说明符 ) auto: 让编译器替我们分析表达式的类型 互联网新技术在线教育领航者 32
C++ 对 C 的扩展 ( 练习 : 进制转换, 填空 ) 进制转换 : 输入 : 整数 ( 如 :256) 输出 :10 进制的字符串 ( 256 ) 16 进制的字符串 ( FF ) 思路 : 通过取余操作逐个得到 num 的个位 十位 百位 存入数组然后反向取出 互联网新技术在线教育领航者 33
C++ 对 C 的扩展 ( 练习 : 进制转换 ) 进制转换 : 输入 : 整数 ( 如 :256) 输出 :10 进制的字符串 ( 256 ) 16 进制的字符串 ( FF ) 互联网新技术在线教育领航者 34