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