第2章面向过程程序设计概述.ppt
1,C+面向对象程序设计,第2章 面向过程程序设计概述,2,第2章 面向过程程序设计概述,本章学习要点,从C语言到C+的发展历程简单的C+程序C+在面向过程程序设计方面对C语言的扩充C+的输入输出、数据类型、常变量及指针C+的引用、函数、名字空间、字符串变量、复数变量C+程序的编写和实现,3,本章学习目标,了解从C语言到C+的发展历程对简单的C+程序有整体的感性认识掌握C+在面向过程程序设计方面对C的扩充掌握C+的输入输出、数据类型、常变量及指针掌握C+的引用、函数、名字空间、字符串变量、复数变量熟悉C+程序的编写和实现流程,第2章 面向过程程序设计概述,4,2.1 从C语言到C+,C语言到C+的发展历程,C+3.0,C+1.0,带类的C,89年,增加类的多继承,91年,增加模板,增加异常处理、名字空间、运行时类型识别,97年,美国C+标准正式发布,5,下面看几个简单的C+程序,【例2-1】在屏幕上输出一行字符“Welcome to C+!”。#include/包含头文件命令using namespace std;/使用名字空间stdint main()cout“Welcome to C+!endl;/输出字符串到屏幕 return 0;/main函数返回0至操作系统,2.2 简单C+程序,6,【例2-2】通过函数求两个整数a和b中的较大者。#include/包含头文件命令using namespace std;/使用名字空间stdint Max(int x,int y)return xy?x:y;/求两数中的大者函数Maxint main()int a,b;/定义两个整型变量a和b coutab;/等待用户从键盘输入数据 coutThe bigger is Max(a,b)endl;return 0;,2.2 简单C+程序,7,#include/包含头文件命令using namespace std;/使用名字空间stdint main()int a,b;/定义两个整型变量a和b coutab;/等待用户从键盘输入数据 int Max(int x,int y);/Max函数原型声明 cout y?x:y;,2.2 简单C+程序,变量可以在程序的任何地方定义,但要在使用前,8,2.2 简单C+程序,【例2-3】声明一个关于人的类Person,人的信息包括姓名、性别、年龄,程序运行后,人可以输入自己的信息,也可以显示自己的信息。,#include/包含头文件命令 using namespace std;/使用名字空间std class Person int main();return 0;,9,2.2 简单C+程序,class Person/类的声明public:/以下为类的公用成员函数void SetInfo()/公用成员函数SetInfo coutnamesexage;void Show()/公用成员函数Show cout name:name;cout sex:sex;cout age:ageendl;private:/以下为类的私有数据成员char name20;/私有数据成员namechar sex2;/私有数据成员sexint age;/私有数据成员age;/类声明结束,此处必须有分号,10,2.2 简单C+程序,int main()/main函数 Person person1,person2;/定义Person类的两个对象person1,person2 person1.SetInfo();/对象person1信息输入 person2.SetInfo();/对象person2信息输入 person1.Show();/对象person1信息输出 person2.Show();/对象person2信息输出 return 0;,11,注意:类的声明和对象的定义的语法形式。类中的成员分为数据成员和成员函数,成员的可见性分为 3种:公用、私有、受保护。类的概念的理解:类是一种用户自定义数据类型,它是不占用实际存储空间的。对象的理解:对象是类类型的变量,系统会为对象分配内存空间。,2.2 简单C+程序,12,2.3 C+对C语言的扩充,在输入输出方面的扩充对数据类型的扩充常变量在指针方面的扩充引用的概念在函数方面的扩充名字空间的概念字符串变量复数变量,本章重点,13,2.3.1 C+的输入输出,C语言输入输出的实现通过输入输出库函数实现C语言的输入输出存在着格式复杂、无法保证安全性、无法对自定义类型整体输入输出等缺点 C+对C输入输出的扩充C+的输入/输出(I/O)流类库“流”的思想cout、cin对象,运算符,14,2.3.2 数据类型的扩展,新增数据类型,功能进行了扩充,15,C+对C语言的结构体、共用体、枚举等自定义数据类型做了扩充。,2.3.2 数据类型的扩展,16,struct Student int num;char name20;char sex;void display()coutnum=numendl;coutname=nameendl;coutsex=sexendl;,2.3.2 数据类型的扩展,17,struct Student private:int num;char name20;char sex;public:void display()coutnum=numendl;coutname=nameendl;coutsex=sexendl;,Student stud1,stud2;,2.3.2 数据类型的扩展,18,在C+中用结构体类型名、共用体类型名、枚举类型名定义变量时,不必在类型名前加上前缀struct、union、enum。,2.3.2 数据类型的扩展,19,struct student char ID15;char name20;int age;,union xy int x;char y;enum color black,white,red,student stud;xy x1;color col;,struct student stud;unoin xy x1;enum color col;,C语言,C+,2.3.2 数据类型的扩展,20,2.3.3 用const定义常变量,直接常量和符号常量使用符号常量需要注意的问题:运行时不分配内存单元符号常量没有类型,在编译时不进行类型检查注意替换后的表达式和预想的表达式是否一致,int x=1,y=2;#define PI 3.14159#define R x+y coutPI*R*Rendl;,输出语句输出的并不是 3.14159*(x+y)*(x+y),而是 3.14159*x+y*x+y。,21,2.3.3 用const定义常变量,为了使常量也能像变量那样进行类型检查,C+提供了用const定义常变量的方法定义常变量的语法:const float PI=3.14159;,注意:常变量要在定义的同时进行初始化,可以是具体的数值,也可以是表达式。,22,【例2-4】利用常变量计算圆的面积。#include using namespace std;int main()const float PI=3.14;/定义常变量 float radius=0;coutradius;coutThe area of circle is:PI*radius*radiusendl;return 0;,2.2 简单C+程序,float const PI=3.14;/定义常变量,23,2.3.4 指针,指针指针是一个重要概念,如果使用得当可以使程序高效、简洁、紧凑。如果对指针掌握不牢固,编程则会出现意想不到的错误 指针是内存单元的地址 经常所讲的指针是指针变量的简称,是用来存放指针(地址)的变量。本节重点讨论C+中使用指针需要注意的地方,24,2.3.4.1 指针与0,空指针空指针表示“未分配”或者“尚未指向任何地方”的指针 空指针一般用来判断内存分配是否成功注意:“空指针”与“野指针”的区别在指针上下文中的常数0被编译成空指针 程序员更常使用符号常量NULL来表示空指针,未初始化的指针,25,【例2-5】指针与0。#include using namespace std;int main()int x=100;/定义整型变量x并初始化为100 int*p=0;/定义空指针p/*p=50;/此语句编译出错,不能使用空指针p=,2.2 简单C+程序,int*p=NULL,26,2.3.4.2 指针与const,int*p=NULL,const int*p=NULL,int const*p=NULL,指向const变量的指针,int*const p=NULL,27,2.3.4.2 指针与const,【例2-6】指向const变量的指针。include using namespace std;int main()const int*p=NULL;/定义指向const变量的指针pconst int a=10;/定义常变量ap=,通过本例可以看到可以改变指向const变量的指针的指向,但是不能通过指针修改指针指向单元的内容。,28,2.3.4.2 指针与const,【例2-7】const指针。#include using namespace std;int main()int a=10;/定义普通变量aint b=100;/定义普通变量bint*const p=,通过本例可以看到可以改变const指针指向单元的内容,但是不能改变const指针的指向。,29,2.3.4.2 指针与const,【例2-8】指向const变量的const指针。#include using namespace std;int main()int a=10;int b=100;const int*const p=,对于指向const变量的const指针,既不能改变指针指向单元的内容,也不能改变指针的指向。,30,2.3.4.2 指针与const,小结指针和const的关系比较复杂,const有两个位置,可形成三种指针:,const int*p=NULL,int const*p=NULL,指向const变量的指针,int*const p=NULL,31,2.3.4.2 指针与const,小结指针和const的关系比较复杂,const有两个位置,可形成三种指针:,const int*const p=NULL,int const*const p=NULL,指向const变量的const指针:,32,2.3.4.3 void指针,void在作为函数类型和参数类型时为空类型,表示没有返回值或参数。void修饰指针时称为“无类型指针”,表示该指针可以指向任意类型的变量。虽然void指针可以指向任意类型的数据,但是在使用void指针时必须对其进行强制类型转换,转换成它所指向单元的实际类型,然后才可以使用。,33,2.3.4.3 void指针,【例2-9】void指针的定义与使用。#include using namespace std;int main()int x=100;void*p=,34,2.3.4.3 void指针,为什么要使用void指针因为void指针可以指向任意类型的数据,所以使用void指针时把void指针所指向的数据给抽象化了,这样可以增加程序的通用性 使用void指针的两个例子,void*memcpy(void*dest,const void*src,size_t len);,void*malloc(unsigned int size);,35,2.3.4.4 new和delete,C语言的动态内存管理malloc()和free()函数主要缺点函数的返回值是void*类型 分配内存单元时根据参数size的值来分配,无法检查错误分配到的内存单元无法初始化C+中使用new和delete运算符进行动态内存管理,P31 最后,36,【例2-11】使用new和delete动态管理内存单元。#include using namespace std;int main()int*p=NULL;p=new int;cout*p=*pendl;delete p;p=NULL;return 0;,2.3.4.4 new和delete,37,申请内存空间并进行初始化 指针变量=new 数据类型(初值);分配多个连续变量的存储空间 使用new 和delete 指针变量=new 数据类型元素个数;delete 指针变量;,三种动态内存管理的方式:兼容C语言的malloc/free方式,单个变量的new/delete方式,多个变量的new/delete 方式,2.3.4.4 new和delete,38,2.3.5 引用,引用就是某一变量的别名,对引用的操作与对变量直接操作完全一样 引用的声明方式 类型标识符,39,2.3.5 引用,int a;int,在声明一个引用时,引用前面的类型标示符是指目标变量的类型,且必须同时使之初始化,即声明它代表哪一个变量.,40,【例2-12】使用引用访问变量。#include using namespace std;int main()int x=100;/定义整型变量x int,程序运行结果如下:rx=100 x=200,2.3.5 引用,41,补充:关于引用的简单说明,(1)引用并不是一种独立的数据类型,声明引用时必须指定其代表某一类型的实体(如变量、类对象),即对它初始化。,int a;int,42,(2)引用与其所代表的变量共享同一内存单元,系统并不为引用另外分配存储空间。,int a=3;int,补充:关于引用的简单说明,43,int a=3;int/声明c是整型引用b的别名,(3)对引用的初始化,可以用一个变量名,也可以用另一个引用。如:,补充:关于引用的简单说明,44,(4)引用在初始化后不能再被重新声明为另一变量的别名。,int a=3,b=4;int/企图重新声明c为整型变量b的别名,补充:关于引用的简单说明,45,(5)当&a的前面有类型符时(如 int&a),它必然是对引用的声明;如果前面没有类型符时(p=&a),此时的&是取地址运算符。,int a=3,b=4;int,补充:关于引用的简单说明,46,实际上,在C+程序中很少使用独立变量的引用,如果要使用某一个变量,就直接使用它的原名,没有必要故意使用它的别名。前面举的例子只是为了说明引用的特征和基本的用法。C+之所以增加“引用”,主要是利用它作为函数参数,以扩充函数传递数据的功能,补充:关于引用的简单说明,47,在C语言中,函数的参数传递有以下两种情况:,(1)值传递:,将变量名作为形参和实参。,此时传递给形参的是实参变量的值,数据传递是单向的,在函数执行期间形参值发生变化并不回传给实参。,(2)地址传递:,48,(2)地址传递:,形参是指针变量,实参是变量的地址。函数调用时,形参指向实参变量单元,数据传递是双向的。,49,【例2-13】编写一个函数,交换两个整型变量的值。,(1)值传递:,教材39,50,(2)地址传递:传递变量的地址(指针),【例2-13】编写一个函数,交换两个整型变量的值。,51,(3)引用传递:,【例2-13】编写一个函数,交换两个整型变量的值。,52,#include using namespace std;void Change(int,2.3.5 引用,53,对引用的进一步说明,(1)不能建立数组的引用。“引用”只能是变量或对象的引用。数组是具有某种类型的数据的集合,其名字表示该数组的起始地址而不是一个变量。所以不能建立数组的引用。char c6=“hello”;char,54,(3)可以将变量的引用的地址赋给一个指针,此时指针指向的是原来的变量,如 int a=3;int,对引用的进一步说明,55,(4)可以建立指针变量的引用,如 int i=3;int*p=,对引用的进一步说明,56,(5)可以用const对引用加以限定,不允许改变该引用的值。如 int i=5;const int,但可以 i=3,对引用的进一步说明,57,利用常引用作为函数形参,既能提高程序的执行效率,又能保护传递给函数的数据不在函数中被改变,达到保护实参的目的,对引用的进一步说明,void show(const int,58,(6)可以用常量或表达式对引用进行初始化,但此时必须用const作声明。如 int a=3;const int,int temp=a+3;const int,用这种方式不仅可以用表达式对引用进行初始化,还可以用不同类型的变量对之初始化。,对引用的进一步说明,59,double d=3.14159;const int,int temp=d;const int,对引用的进一步说明,60,引用作为函数的返回值,【例2-14】引用作为函数的返回值。#include using namespace std;int,2.3.5 引用,61,引用作为函数的返回值,【例2-14】引用作为函数的返回值。int main()int a=2,b=3;cout a=a b=b endl;Max(a,b)=4;/*由于函数的返回值为引用,所以可以为函数赋值,为函数赋的值实际赋给了两个参数中的大者,所以a的值为2,b的值为4*/cout a=a b=b endl;return 0;,2.3.5 引用,62,引用作为函数的返回值,引用作为函数的返回值的补充示例。class stringpublic:string,2.3.5 引用,63,指针与引用的区别:(1)从内存分配上看:指针变量需要分配内存区域,而引用不需要分配内存区域。(2)指针可以有多级,但是引用只能是一级(int*p;合法 而 int&a是不合法的);(3)指针的值可以为NULL,但是引用的值不能为NULL,并且引用在定义的时候必须初始化;(4)指针的值在初始化后可以改变,即指向其它的存储单元,而引用在进行初始化后就不能再改变了;(5)指针和引用的自增(+)运算意义不一样。,2.3.5 引用,64,引用以简略的方式取代了某些条件下指针的作用,尤其适合函数的参数传递。但有些时候,引用还是不能替代指针,这样的情况主要包括以下几种。(1)如果一个指针所指向的对象,需要用分支结构加以确定,或者在中途需要改变它所指向的对象,那么在它初始化之后需要为它赋值,而引用只能在初始化时指定被引用的对象,所以不能胜任。,2.3.5 引用,65,引用以简略的方式取代了某些条件下指针的作用,尤其适合函数的参数传递。但有些时候,引用还是不能替代指针,这样的情况主要包括以下几种。(2)有时一个指针的值可能是空指针,例如当把指针作为函数的参数类型或返回类型时,有时会用空指针表达特定的含义,而没有空引用之说,这时引用不能胜任。,2.3.5 引用,66,引用以简略的方式取代了某些条件下指针的作用,尤其适合函数的参数传递。但有些时候,引用还是不能替代指针,这样的情况主要包括以下几种。(3)由于没有函数引用,所以函数指针无法被引用替代。(4)用new动态创建的对象或数组,需要用指针来存储它的地址。(5)以数组形式传递大批量数据时,需要用指针类型参数(注意:参数中出现T s与T*s是等价的)。,2.3.5 引用,67,面向过程的C+程序中的函数与C语言中的函数基本相同面向对象的C+程序中的函数有成员函数和公共函数之分主要讨论面向过程的C+程序中函数与C语言函数的区别,2.3.6 函数,68,2.3.6.1 函数原型声明,在函数尚未定义的情况下,先将函数的形式告诉编译系统,以便编译能够正常进行 函数原型声明的语法形式有两种:,(1)返回值类型 函数名(参数类型1,参数类型2,.);(2)返回值类型 函数名(参数类型1 参数名1,参数类型2 参数名2,.);,函数原型声明和函数定义是不同的。函数原型声明不是一个独立的完整的函数单位,它仅仅是一条语句,因此在函数原型声明后面一定要加上分号。,69,2.3.6.2 函数默认参数,在多次调用一个函数将实参传递给形参时,其中可能有一个或几个参数,它们传递进来的实参值多次相同在定义或声明函数时,给形参一个默认值,如果在调用时没有给该形参传递实参值,则使用默认值作为该形参的值;如果调用时给该形参传递了实参值,则使用实参的值作为该形参的值。,70,2.3.6.2 函数默认参数,【例2-16】求两个或三个正整数中的最大值,使用带有默认参数的函数实现。#include using namespace std;int main()int Max(int,int,int=0);/带有默认参数的函数原型声明int a=5,b=8,c=10;cout“Max of(a,b)is:Max(a,b)endl;cout“Max of(a,b,c)is:Max(a,b,c)endl;return 0;,/定义带有默认参数的函数int Max(int a,int b,int c=0)if(a b)a=b;if(a c)a=c;return a;,71,2.3.6.2 函数默认参数,1.指定默认值参数默认值的位置:为了避免混淆,最好只在函数原型声明时指定默认值。2.当只有部分形参带有默认值时,带有默认值的参数必须放在形参表的右端。3.当一个函数既是重载函数,又是带有默认参数的函数时,要注意不要出现二义性的问题,注意,调用带有默认参数的函数时,实参的个数可以与形参的个数不同,对于实参未给出的,可以从形参的默认值中获得,利用这一特性,可以使函数的使用更加灵活。,72,2.3.6.3 函数与引用,函数与引用联合使用主要有两种方式:1.函数的参数是引用 当使用引用作为函数的形参时,引用不是一个单独的变量,不需要在内存中分配存储单元,实参向形参传递的是变量的名字。使用引用作为函数的形参可以部分代替指针,降低了程序的复杂度,提高了程序的执行效率,同时也提高了程序的可读性。2.函数的返回值是引用,73,2.3.6.3 函数与引用,函数与引用联合使用主要有两种方式:2.函数的返回值是引用以引用作为函数的返回值是为了使函数可以作为左值而被赋值。函数的返回值为引用类型表示该函数的返回值是一个内存变量的别名。可以将函数调用作为一个变量来使用,可以为其赋值。,74,引用作为函数的返回值,回顾:【例2-14】引用作为函数的返回值。class stringpublic:/重载赋值运算符 string,2.3.5 引用,75,2.3.6.3 函数与引用,函数与引用联合使用主要有两种方式:2.函数的返回值是引用定义返回引用的函数时,注意不要返回对该函数内的自动变量的引用。否则,因为自动变量的生存期仅局限于函数内部,当函数返回时,自动变量就消失了,函数就会返回一个无效的引用。函数返回的引用是对某一个函数参数的引用,而且这个参数本身也是引用类型,76,2.3.6.4 函数与const,const修饰函数的参数const修饰函数的返回值const修饰整个函数,77,2.3.6.4 函数与const,const修饰函数的参数调用函数时用相应的值初始化const常量函数体按照const所修饰的部分进行常量化,void show(const int,78,2.3.6.4 函数与const,const修饰函数的返回值用于二目操作符重载函数并产生新对象,const Fraction operator*(const Fraction,79,2.3.6.4 函数与const,const修饰整个函数这种情况发生在类的成员函数时 const的位置放在函数参数表的后面,class stringpublic:int compare(const string,80,2.3.6.5 函数重载,问题:求2个数的和。(分别考虑整数、浮点数的情况),int AddInt(int a,int b)coutCall integer add function.endl;return a+b;float AddFloat(float a,float b)coutCall float add function.endl;return a+b;,81,2.3.6.5 函数重载,C+允许在同一个作用域中用同一函数名定义多个函数,这些函数的参数个数或参数类型不相同,这些同名的函数用来实现同一类的操作。这就是函数的重载。即对一个函数名重新赋予它新的操作,使一个函数名可以多用。,82,2.3.6.5 函数重载,【例2-18】使用Add为函数名定义两个整数的加法函数和两个浮点数的加法函数.int Add(int a,int b)/整数加法的add函数定义 coutCall integer Add function.endl;return a+b;float Add(float a,float b)/浮点数加法的add函数定义 coutCall float Add function.endl;return a+b;,83,2.3.6.5 函数重载,【例2-19】使用Add作为函数名定义两个整数的加法函数和三个整数的加法函数。int add(int a,int b)return a+b;float add(float a,float b,int c)return a+b+c;,84,2.3.6.5 函数重载,函数重载需要函数参数的类型或个数必须至少有其中之一不同,函数返回值类型可以相同也可以不同。但是,不允许参数的个数和类型都相同而只有返回值类型不同。从语法上来说,可以让两个或多个完全不相干的函数使用相同的函数名,进行重载,但是这样做使得程序的可读性下降,不建议这样做。使用同名函数进行重载时,重载函数在功能上应该相近或属于同一类函数。,85,函数调用需要一定的时间和空间的开销。(保护现场/恢复现场,参数传递等),2.3.6.6 内置函数,86,2.3.6.6 内置函数,由于调用函数时系统需要一定的时间和空间的开销(保护现场/恢复现场,参数传递等)。当函数体很小而又需要频繁调用时,运行效率与代码重用的矛盾变得很突出。这时函数的运行时间相对比较少,而函数调用所需的栈操作等却要花费比较多的时间。,87,2.3.6.6 内置函数,C+解决这个问题的方法就是内置函数(inline function),也称为内联函数或内嵌函数。系统在编译时将所调用函数的代码直接嵌入到主调函数中,这样在程序执行时就不会发生函数调用,而是顺序执行了。,88,2.3.6.6 内置函数,【例2-20】将函数声明为内置函数。#include using namespace std;int main()int x=3,y=5;int s;inline int Sum(int a,int b);/内置函数原型s=Sum(x,y);/调用函数Sum couts=sendl;return 0;/定义内置函数Sum inline int Sum(int a,int b)return a+b;,int a,b;a=x;b=y;s=x+y;,89,2.3.6.6 内置函数,1.在声明内置函数时,可以在函数声明和函数定义的前面都写上关键字inline,也可以只在其中一处写上关键字inline,效果都是相同的。2.内置函数是一种“以空间换时间”的策略。3.对函数进行内置声明,只是程序员对编译系统的一个建议而非命令,并不一定只要声明为内置函数C+系统就一定会按内置函数去处理,系统会根据实际情况决定是否这样做。4.内置函数的机制适用于被调函数规模较小而又被频繁调用的情况。,注意,90,内置函数与用#define命令实现的带参宏定义有些相似,但不完全相同。,2.3.6.6 内置函数,91,补充实例:用带参宏定义实现求平方值。#include using namespace std;#define power(x)x*xint main()coutpower(2)endl;coutpower(1+1)endl;return 0;,宏定义是在编译前由预处理程序对其预处理,它只作简单的字符置换而不作语法检查,往往会出现意想不到的错误。,92,补充实例:用内置函数实现求平方值。#include using namespace std;inline int power(int x)/改用内置函数 return x*x;int main()coutpower(2)endl;coutpower(1+1)endl;return 0;,自从有了内置函数,一般不再用#define带参宏定义了。,93,2.3.7 名字空间,1.为什么需要名字空间 引用名字空间的概念就是为了解决程序中名字冲突的问题 2.什么是名字空间 所谓名字空间就是一个由程序设计者命名的内存区域 根据需要指定一些有名字的空间域,把一些全局标识符放在各个名字空间中,从而避免与其他同名的全局标识符混淆,94,2.3.7 名字空间,3.如何使用名字空间 定义名字空间时,语法如下:其中成员的类型包括:常量、变量、函数、结构体、类、模板等,还可以是名字空间。,namespace 名字空间名 定义成员,95,2.3.7 名字空间,定义名字空间举例:namespace ns const int RATE=0.08;double money;double tax()return money*RATE;namespace ns2 int count;,如果要访问名字空间ns中的成员,可以采用名字空间:成员名的方法,如ns:RATE、ns:money、ns:tax()、ns:ns2:count等,可以看到,在访问名字空间的成员时可能需要写很长的一串名字,使用时不太方便,为此C+提供了一些简化机制。,96,2.3.7 名字空间,访问名字空间中成员的简化机制:,(1)使用名字空间的别名 namespace Information.可以用一个较短的缩写作为别名来代替它。如:namespace Info=Information;,97,2.3.7 名字空间,访问名字空间中成员的简化机制:,(2)使用using名字空间的成员名,如:using ns:tax;后面访问tax()时就相当于ns:tax(),(3)使用using namespace名字空间名,如:using namespace ns;这样在using namespace声明的作用域中,名字空间ns中的成员就好像在全局域声明一样,可以直接使用而不必加名字空间名限定,98,2.3.7 名字空间,4.无名的名字空间 没有名字的名字空间 由于没有名字空间名,在别的文件中无法访问,它只能在本文件的作用域内有效。相当于将无名名字空间的成员的作用域限制在本文件内。,namespace void func()coutfunc in noname namespace!endl;,99,2.3.7 名字空间,5.标准名字空间std C+系统将标准C+库中的所有标识符都放在名为std的名字空间中定义,即系统预定义的头文件中的函数、类、对象和类模板都是在名字空间std中定义的一旦使用了名字空间std,就必须保证在程序中不再定义与名字空间中已经出现的标识符同名的量。例如在程序中不能再定义名为cin或cout的对象。,100,2.3.8 字符串变量,C语言对字符串的处理C+除保留C语言对字符串的处理方式外,又增加了一种新的类型:字符串类用字符串类定义的字符串类类型的变量称为字符串变量。字符串变量可以代表一个字符串,而不必去关心字符串的内存分配问题,101,2.3.8.1 字符串变量定义,定义字符串变量和定义普通变量一样,string str1;/定义名字为str1的字符串变量,/定义名字为str2的字符串变量并初始化string str2=Hello C+;,102,2.3.8.1 字符串变量定义,string不是基本数据类型,所以在使用时需要在文件的开头包含C+标准库中的string头文件 注意:头文件的名字是string,而不是string.h,#include,103,2.3.8.2 字符串变量赋值,使用字符串变量可以直接使用赋值运算符给字符串变量赋值。在赋值的过程中不必关心赋值的两个字符串的长度是否一致,字符串变量的长度随字符串的长度改变而改变。字符串变量只存储字符串本身的字符,而不包括结束符0。还可以用数组的方式对字符串变量中的某个字符进行操作。,str1=Hello!;str1=str2;,104,2.3.8.3 字符串变量输入输出,字符串变量可以像普通变量那样使用输入输出流进行输入输出,如:string str1;cin str1;cout str1;,105,2.3.8.4 字符串运算,字符串复制用赋值号(=),如:str1=str2;字符串连接用加号(+),如:string str1=“Hello”;string str2=“C+”;string str3=str1+str2;字符串比较直接使用关系运算符。可以直接使用=、=、=等关系运算符来进行字符串的比较,106,2.3.8.5 字符串数组,定义一个字符串数组strArray并初始化:string strArray5=Hello,this,is,C+,program;,strArray0strArray1strArray2strArray3strArray4,图2-2 字符串数组strArray的内存状况,107,2.3.8.6 字符串变量综合举例,【例2-21】使用字符串数组实现简易的英汉词典的功能。#include#include using namespace std;int main()/定义二维字符串数组dict作为英汉词典的数据结构string dict1002=“address”,“地址”,“button”,“按钮”,“code”,“代码”,“design”,“设计”,“execute”,“执行”,“file”,“文件”,“go”,“走”,“help”,“帮助”,“integer”,“整数”,“join”,“加入”,“keyboard”,“键盘,label,标签,make,制造,name,姓名,operate,操作,plus,加,zoo,动物园;,108,2.3.8.6 字符串变量综合举例,string word;while(1)coutword;/输入字符串至字符串变量wordfor(int i=0;i=100)cout next;if(i=100)cout next;,109,while(next!=Y/main函数结束,2.3.8.6 字符串变量综合举例,110,2.3.9 复数变量,复数运算在数学领域非常重要,C+语言提供的基本数据类型中并没有复数类型,但在C+标准库中提供了一个complex类模板(复数类模板),利用该类模板可以在程序中轻松处理复数。关于类模板将在第8章8.2节介绍,在这里不必深究,只要按教材中给出的书写形式定义复数变量就可以了。,111,2.3.9 复数变量,复数的一般表示如下:5+6i这里5代表实数部分,而6i表示虚数部分。这两部分合起来表示一个复数。,1.复数变量的定义:复数变量的定义一般可以使用以下形式:complex complex1(0,5);/实数部分为0的复数:0+5icomplex real_num(2);/虚数部分为0的复数:2+0i,112,2.3.9 复数变量,1.复数变量的定义:复数变量的定义一般可以使用以下形式:complex zero;/实部和虚部均为0的复数:0+0icomplex complex2(complex1);/用另一个复数变量来初始化一个复数变量这里,复数变量有float、double或long double三种表示。我们也可以声明复数数组、复数指针或引用。,113,2.3.9 复数变量,1.复数变量的定义:/声明复数数组complex arr2=complex(2,3),complex(2,-3);complex*ptr=/声明复数引用注意:要使用complex类模板,必须在程序的开头加上“#include”,并在std命名空间内引用。,1