logo资料库

轻松搞定C++语言.pdf

第1页 / 共213页
第2页 / 共213页
第3页 / 共213页
第4页 / 共213页
第5页 / 共213页
第6页 / 共213页
第7页 / 共213页
第8页 / 共213页
资料共213页,剩余部分请下载后查看
1. 综述 C++
1.1. 作者
1.2. 历史背景
1.2.1. 应“运”而生?运为何?
1.2.2. C++发展大记事
1.3. 应⽤领域
1.3.1. 系统层软件开发
1.3.2. 服务器程序开发
1.3.3. 游戏,网络,分布式,云计算
1.3.4. 科学计算
1.4. 内容
1.5. 书籍推荐
2. C++对C语言的加强
2.1 namespace命名空间
2.1.1 C++命名空间基本常识
2.1.2 C++命名空间定义以及使用方法
2.1.3 C++命名空间编程实践
2.1.4 结论
2.2 “实用性”增强
2.3 变量检测增强
2.4 struct 类型增强
2.5 C++中所有变量和函数都必须有类型
2.6 新增bool类型关键字
2.7 三目运算符功能增强
2.8 const增强
2.8.1 const基础知识
2.8.2 C语言中的“冒牌货”
2.8.3 const 和 #define 的相同
2.8.4 const 和 #define 的区别
2.9 真正的枚举
3. C++对C语言的拓展
3.1 引用
3.1.1 变量名
3.1.2 引用的概念
3.1.3 规则
3.1.4 引用作为函数参数
3.1.5 引用的意义
3.1.6 引用的本质
3.1.7 引用作为函数的返回值(引用当左值)
3.1.8 指针引用
3.1.9 const 引用
3.1.10 const引用的原理
3.2 inline内联函数
3.2.1 内联函数基本概念
3.2.2 内联函数 vs 宏函数
3.2.3 内联函数总结
3.3 默认参数和占位参数
3.3.1 单个默认参数
3.3.2 多个默认参数
3.3.3 默认参数规则
3.3.4 占位参数
3.4 函数重载
3.4.1 重载规则
3.4.2 调用准则
3.4.3 重载底层实现(name mangling)
3.4.4 函数重载与函数默认参数
3.4.5 函数重载和函数指针结合
3.4.6 函数重载总结
4. 类和对象
4.1 基本概念
4.1.1 类与对象
4.1.2 成员变量和成员函数
4.2 封装和访问控制
4.2.1 从struct说起
4.2.2 封装的访问属性
4.2.3 用class去封装带行为的类
4.3 面向对象编程案例练习
4.3.1 求圆的周长和面积
4.3.2 初学者易犯错误模型
4.3.3 C语言和C++语言的关系
4.3.4 综合面向对象案例练习
4.4 对象的构造和析构
4.4.1 如果没有构造函数?
4.4.2 构造函数
4.4.3 析构函数
4.4.4 构造函数的分类及调用
(1) 无参构造函数
(2) 有参数构造函数
(3) 拷贝构造函数
使用拷贝构造函数的几种场合
(5) 默认构造函数
4.4.5 构造函数规则
4.4.6 浅拷贝与深拷贝
4.4.7 构造函数初始化列表
4.4.8 强化训练
4.5 对象动态建⽴和释放 new 和delete
4.6 静态成员变量和成员函数
4.6.1 静态成员变量
4.6.2 静态成员函数
4.7 编译器对属性和⽅法的处理机制
4.7.1 静态成员占多大
4.7.2 处理机制
4.7.3 this指针
4.7.4 全局函数与成员函数
4.8 强化练习
4.9 友元
4.9.1 友元函数
类成员函数作友元函数
4.9.2 友元对象
4.9.3 论友元
4.10 运算符重载
4.10.1 友元重载
4.10.2 成员重载
4.10.2 重载规则
4.10.3 双目运算符重载
4.10.4 单目运算符重载
4.10.5 输入输出运算符重载
4.10.6 友元还是成员
4.10.7 运算符重载提高
(1) 赋值运算符重载 (operator=)
(2) 数组下标运算符 (operator[])
(3) 函数调用符号 (operator () )
(4) 不可重载&&和||操作符
(5)解引用与智能指针
5. 继承和派生
5.1 类和类之间的关系
5.2 什么是继承
5.3 继承的方式
5.3.1 语法
5.3.2 protected 访问控制
5.3.3 派生类成员的标识和访问
5.4 继承中的构造和析构
5.4.1 类型兼容性原则
5.4.2 继承中的对象模型
5.4.3 继承中构造析构调用原则
5.4.4 继承和组合并存,构造和析构原则
5.4.5 继承中同名成员变量处理方法
5.4.6 派生类中的static关键字
5.5 多继承
5.5.1 语法
5.5.2 沙发床实现
5.6虚继承
5.6.1 多继承中二义性问题
5.6.2 虚继承virtual
6. 多态
6.1 什么是多态
6.1.1 浅析多态的意义
6.1.2 赋值兼容(多态实现的前提)
6.1.3 面向对象新需求
6.1.4 解决方案
6.1.5 多态工程的意义
6.1.6 多态成立的条件
6.1.6 静态联编和动态联编
6.2 虚析构函数
6.3 重载、重写、重定义
6.4 多态的实现原理
6.4.1 虚函数表和vptr指针
6.4.2 证明vptr指针的存在
6.4.3 构造函数中能否调用虚函数,实现多态?
6.4.4 父类指针和子类指针的步长
6.5 有关多态的理解
6.6 纯虚函数和抽象类
6.6.1 基本概念
6.6.2 纯虚函数和抽象类
6.6.3 抽象类在多继承中的应用
6.7 面向抽象类编程案例
6.8 C语言中的面向接口编程
6.8.1 函数类型语法基础
6.8.2 函数指针做函数参数
7. 模板
7.1 函数模板
7.1.1 函数重载实现的泛型
7.1.2 函数模板的引入
7.1.3 函数模板的实例
7.1.4 函数模板与函数重载
7.1.5 编译器对模板机制剖析
7.2 类模板
7.2.1 类模板定义
7.2.2 简单的模板类
7.2.3 模板类的派生
7.3 类模板实现
7.3.1 函数体写在类中
7.3.2 函数体写在类外(在一个cpp中)
7.3.3 函数体写在类外(在.h和.cpp中)
7.3.4 类模板中的static
8 类型转换
8.1 类型转换的名称和语法
8.2 转换方式
8.2.1 static_cast 静态类型转换
8.2.2 dynamic_cast 子类和父类之间的多态类型转换
8.2.2 const_cast 去掉const属性转换
8.2.3 reinterpret_cast 重新解释类型转换
9 异常
9.1 异常处理的基本思想
9.1.1 传统的错误处理机制
9.1.2 异常的错误处理机制
9.2 C++异常处理的实现
9.2.1 异常的基本语法
9.2.2 栈解旋(unwinding)
9.2.3 异常接口声明
9.2.4 异常类型和异常变量的生命周期
9.2.5 异常的层次结构
9.3 标准程序库异常
10. 输入输出流
10.1 I/O流的概念和流类库的结构
10.2 标准I/O流
10.2.1 标准的输入流
10.2.2 标准的输出流
10.2.3 输出格式化
10.3 文件IO
10.3.1 文件流类和文件流对象
10.3.2 文件的打开与关闭
10.3.3 C++对ASCII文件的读写操作
10.3.4 C++对二进制文件的读写操作
10.3.5 作业及参考答案
附录A
    C plus plus …                       1
1. 综述 C++ 1.1. 作者 1982 年,美国  AT&T 公司贝尔实验室的  Bjarne Stroustrup 博士在  c 语言的 基础上引  入并扩充了面向对象的概念,发明了一种新的程序语言。为了表达该 语言与  c 语言的渊  源关系,它被命名为  C++。而  Bjarne Stroustrup(本贾尼·斯特 劳斯特卢普)博士被尊称  为  C++语言之父。                 C++语言之父   2
1.2. 历史背景 1.2.1. 应“运”而生?运为何? 为了解决软件危机,20  世纪  80  年代,计算机界提出了  OOP(object   C  语言作为结构化和模块化的语言,在处理较小规模的程序时,比较得心应 手。但  是当问题比较复杂,程序的规模较大的时,需要高度的抽象和建模时,c  语 言显得力不  从心。       oriented  programming)思想,这需要设计出支持面向对象的程序设计语言。 Smalltalk  就是当时  问世的一种面向对象的语言。而在实践中,人们发现  c  是语 此深入人心,使用如此之广  泛,以至于最好的办法,不是发明一种新的语言去取代 它,而是在原有的基础上发展它。  在这种情况下  c++应运而生,最初这门语言并 不叫  c++而是  c  with  class  (带类的  c)。     1.2.2. C++发展大记事 1983 年 8 月, 第一个 C++实现投入使用
 1983 年 12 月,Rick Mascitti 建议命名为 CPlusPlus,即 C++。
 1985 年 2 月, 第一个 C++ Release E 发布。
 10 月,CFront 的第一个商业发布,CFront Release 1.0。
 10 月,Bjarne 博士完成了经典巨著 The C++ Programming Language 第一版 1986 年 11 月,C++第一个商业移植 CFront 1.1,Glockenspiel。
 1987 年 2 月, CFront Release 1.2 发布。
 11 月,第一个 USENIX C++会议在新墨西哥州举行。
 1988 年 10 月,第一次 USENIX C++实现者工作会议在科罗拉多州举行 1989 年 12 月,ANSI X3J16 在华盛顿组织会议。
 1990 年 3 月, 第一次 ANSI X3J16 技术会议在新泽西州召开.
 1990 年 5 月, C++的又一个传世经典 ARM 诞生。 1990 年 7 月, 模板被加入。 1990 年 11 月,异常被加入。
 1991 年 6 月, The C++ Programming Language 第二版完成。
 1991 年 6 月, 第一次 ISO WG21 会议在瑞典召开。
 1991 年 10 月,CFront Release 3.0 发布。
 1993 年 3 月, 运行时类型识别在俄勒冈州被加入。
 1993 年 7 月, 名字空间在德国慕尼黑被加入。
 1994 年 8 月, ANSI/ISO 委员会草案登记。
 1997 年 7 月, The C++ Programming Language 第三版完成。
 3
1997 年 10 月,ISO 标准通过表决被接受
 1998 年 11 月,ISO 标准被批准。 1.3. 应⽤用领域   如果项目中,既要求效率又要建模和高度抽像,那就选择  c++吧。     1.3.1. 系统层软件开发 C++的语言本身的高效。     1.3.2. 服务器程序开发 面向对像,具有较强的抽像和建模能力。     1.3.3. 游戏,网络,分布式,云计算   效率与建模     1.3.4. 科学计算
 比如大名鼎鼎的  ACE 等科学类库。     C++语言的名字,如果看作  c 的基本语法,是由操作数  c 和运算符后++构 1.4. 内容   成。C++ 是本身这门语言先是  c,是完全兼容  c.然后在此基础上++。这个++包含 三大部分,c++对  c 的基础语法的扩展,面向对像(继承,封装,多态),STL 等。   4
1.5. 书籍推荐   2.  C++对C语言的加强   2.1 namespace命名空间 2.1.1 C++命名空间基本常识   有标识符都被定义于一个名为std的namespace中。   所谓namespace,是指标识符的各种可见范围。C++标准程序库中的所 一  :格式不一样,前者没有后缀,实际上,   在你的编译器include文件夹里面可以看到,二者是两个文件,打开文件就会 发现,里面的代码是不一样的。后缀为.h的头文件c++标准已经明确提出不支 持了,早些的实现将标准库功能定义在全局空间里,声明在带.h后缀的头文件 里,c++标准为了和C区别开,也为了正确使用命名空间,规定头文件不使用 后缀.h。  因此,     名空间,也就是早期的c++实现;     使用namespace  std;这样才能正确使用cout。   2)当使用的时候,该头文件没有定义全局命名空间,必须 1)当使用时,相当于在c中调用库函数,使用的是全局命 5
二:  由于namespace的概念,使用C++标准程序库的任何标识符时,可 1)直接指定标识符。例如std::ostream而不是ostream。完整语句如   以有三种选择:     下:     std::cout  <<  std::hex  <<  3.4  <<  std::endl;   2)使用using关键字。         using  std::cout;   using  std::endl;   using  std::cin;   以上程序可以写成  :   cout  <<  std::hex  <<  3.4  <<  endl;     3)最方便的就是使用using  namespace  std;  例如:  using  namespace   std;这样命名空间std内定义的所有标识符都有效(曝光)。就好像它们被声明 为全局变量一样。那么以上语句可以如下写:  cout  <  和等等这样的头文件,一个是 为了兼容以前的C++代码,一个是为了支持新的标准。命名空间std封装的是 标准程序库的名称,标准程序库为了和以前的头文件区别,一般不加".h"   2.1.2 C++命名空间定义以及使用方法   在C++中,名称(name)可以是符号常量、变量、宏、函数、结构、枚 举、类和对象等等。为了避免,在大规模程序的设计中,以及在程序员使用各 种各样的C++库时,这些标识符的命名发生冲突。 域),可以更好地控制标识符的作用域。 标准C++引入了关键字namespace(命名空间/名字空间/名称空间/名 6
std是c++标准命名空间,c++标准程序库中的所有标识符都被定义在std   中,比如标准库中的类iostream、vector等都定义在该命名空间中,使用时要 加上using声明(using  namespace  std)    或using指示(如std::string、 std::vector).   C中的命名空间 在C语言中只有一个全局作用域 C语言中所有的全局标识符共享同一个作用域 标识符之间可能发生冲突       C++中的命名空间 命名空间将全局作用域分成不同的部分 不同命名空间中的标识符可以同名而不会发生冲突 命名空间可以相互嵌套 全局作用域也叫默认命名空间 C++命名空间的定义:          namespace  name  {    …    }   C++命名空间的使用:                    使用整个命名空间:using  namespace  name;   使用命名空间中的变量:using  name::variable;       使用默认命名空间中的变量:::variable   默认情况下可以直接使用默  认命名空间中的所有标识符     2.1.3 C++命名空间编程实践 #include     namespace  NameSpaceA   {          int  a  =  0;   }   namespace  NameSpaceB   7
{          int  a  =  1;          namespace  NameSpaceC          {                  struct  Teacher                  {                          char  name[10];                          int  age;                  };          }   }   int  main(void)   {          using  namespace  NameSpaceA;          using  NameSpaceB::NameSpaceC::Teacher;          printf("a  =  %d\n",  a);    //0          printf("a  =  %d\n",  NameSpaceB::a);//1          NameSpaceB::NameSpaceC::Teacher  t2;          Teacher  t1  =  {"aaa",  3};          printf("t1.name  =  %s\n",  t1.name);    //aaa          printf("t1.age  =  %d\n",  t1.age);        //3          return  0;   }   2.1.4 结论 1) 当使用的时候,该头文件没有定义全局命名空间,必须使用 namespace std;这样才能正确使用cout。若不引入using namespace std ,需要这 样做。std::cout。 2) c++标准为了和C区别开,也为了正确使用命名空间,规定头文件不使用 后缀.h。 3) C++命名空间的定义: namespace name { … } 4) using namespace NameSpaceA; 5) namespce定义可嵌套。 2.2 “实⽤用性”增强 #include     8
分享到:
收藏