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