机械计算器->电子计算机->面向硬件->
面向指令->面向过程->面向对象->面向问题
Algo68 - 算法 -> Fortran
CPL
BCPL
B
C
C++
一、课程简介
1.C++语法基础(6-7)
从C到C++(1)
类和对象(2)
操作符的重载(1)
继承和多态(1)
异常和IO流(1)
2.数据结构和算法(3)
堆栈和队列(1)
链表和二叉树(1)
排序和查找算法(1)
3.模板和STL(3)
模板语法(1)
STL容器和泛型算法(2)
二、C++语言的诞生和发展
1979.4,Bjarne Stroustrup,C++之父
smalltalk,分布式计算仿真,动态类型
B
AT&T,贝尔实验室,UNIX内核仿真
C,预定义宏,Cpre
1979.10,C with Class
1983,Algol - 运算符重载
Ada - 模板和引用
Clu/ML - 异常和多态
-> C++
1985,cfront 1.0
1987,GNU C++
1990,Borland C++
1992,Microsoft C++,IBM C++,...
1998,ISO C++98
2003,修订C++2003
2011,ISO C++2011,C++0x
三、适用领域
1.科学计算:现代风格的C++算法库。
2.网络和分布式计算:ACE框架。
3.操作系统和设备驱动:性能和代码紧凑性。
4.移动终端:面向对象同时向下兼容C。
5.大型游戏:高性能同时足够强的逻辑建模能力。
C++语言追求性能和OO间的均衡。
四、第一个C++程序
1.编译器:g++
2.扩展名:.cpp/.cc/.cxx/.C
3.头文件:C++的标准头文件都没有.h扩展名
C++对C兼容的头文件
4.输入输出:cin/cout/cerr,>>/<<
scanf (...) -> fscanf (stdin, ...)
printf (...) -> fprintf (stdout, ...)
5.名字空间:标准库中的对象都位于std名字空间中。
五、名字空间
针对全局域的标识符(变量、函数、类型)按照逻辑划分作用域。
1.定义名字空间
namespace 名字空间名 {
名字空间成员
}
2.使用名字空间
名字空间名::名字空间成员
^
作用域限定运算符——“的”
3.名字空间指令
using namespace 名字空间名;
该指令之后对特定名字空间中的成员可见,允许省略名字空间前缀。
4.名字空间声明
using 名字空间名::名字空间成员名;
将制定名字空间中的指定成员名称引入当前作用域,允许省略名字空间前缀。
5.无名名字空间
任何没有被声明在有名名字空间中的标识符,都被置于无名名字空间中,通过“::标识符”显式表明所引用的是无名名字空间中的标识符。
6.名字空间可以嵌套
六、C++中结构、联合和枚举
1.结构
用结构类型定义变量时,可以省略struct关键字。
struct Student {
char name[128];
int age;
};
struct Student s1 = {"张飞", 25}; // C
Student s1 = {"张飞", 25}; // C++
结构内部可以定义函数,称为成员函数。
2.联合
匿名联合
3.枚举
C中的枚举实际上就是整型,而C++中的枚举是一个独立的类型。
七、布尔类型
bool,true,false
八、运算符别名
&& - and
& - bitand
{ - <%
[ - <:
...
九、C++中的函数
1.重载:在同一个作用域中函数名相同但参数表不同的函数构成重载关系。
1)C++是通过换名,即将参数表信息汇合到函数名中,实现重载。通过在函数声明前写上
extern "C"
显式地告知编译器对该函数用C的方式生成接口,即不做换名。当然不换名的函数无法实现重载。
2)函数重载不仅和函数的定义有关,而且与函数调用的上下文有关,只要在同一个作用域中可见,且需要通过重载解析规则确定调用版本,即具有重载特性。
2.缺省参数
1)如果提供实参,取实参的值,否则取缺省值。
2)如果某个参数带有缺省值,那么它后面的所有参数必须都带有缺省值——靠右原则。
3)注意防止和重载发生冲突。
3.哑元
只有类型而没有名称的参数。
本身没有参数但是又需要通过重载区分不同实现版本的函数,往往会用到哑元。
向下兼容。
4.内联
1)内联是一种优化策略,用编译好的函数二进制代码去替换对该函数的调用,通过牺牲空间换取执行时间。
2)通过inline关键字显式地告诉编译器该函数希望被内联优化。
inline void foo (...) { ... }
对于稀少调用的复杂大函数,递归函数,虚函数,编译会拒绝做内联。
3)结构体/类的声明和定义如果放在一起,其成员函数缺省为内联,可以省略inline关键字。