第二篇基于过程的程序设计
2015年4月26日星期日
15:14
1.输入输出流的控制语句
控制符作用
dec设置数值的基数为10
hex设置数值的基数为16
oct设置数值的基数为8
setfill(c)设置填充字符c,c可以是字符常量或字符变量setprecision(n)设置浮点型的数据的精度为n位。在以一般十进制小数
形式输出时,n代表有效数字,在以fixed(固定小数位
数)形式和scientific(指数)形式输出时,n为小数位数。setw(n)设置字段宽度为n位
setiosflags(ios::fixed)设置浮点数以固定小数位数显示
setiosflags(ios::scientific)设置浮点数以科学计数法(即指数形式)表示setiosflags(ios::left)输出数据左对齐
setiosflags(ios::right)输出数据右对齐
setiosflags(ios::skipws)忽略前导空格
setiosflags(ios::uppercase)数据以十六进制形式输出时字母以大写表示setiosflags(ios::lowercase)数据以十六进制形式输出时字母以小写表示setiosflags(ios::showpos)输出正数时给出"+"号
要注意,如果使用了控制符,在程序单位开头还要加iomanip头文件
设置定点形式输出、取两位小数、右对齐。这些设置对其后的输出均有效(除非重新设置),而serw只对其后一个输出项有效。
2.内置函数
即在编译时将所调用的函数的代码直接嵌入到主调函数中,而不是将流程转出去。这种嵌入到主调函数中的函数称为内置函数(inline)。只需在函数首行的左端加一个关键字inline 即可
可以再声明函数和定义函数时同时写inline ,也可以只在函数声明时加inline 而定义函数时不加inline
在函数规模很小的情况下,函数调用的时间开销可能相当于甚至超过执行函数本身的时间,把它定义为内置函数可以大大减少程序运行时间。
内置函数应该不能包括复杂的控制语句,如循环语句可switch语句。
3.函数重载:重载的函数的参数个数、参数类型或参数顺序三者中必须至少有一种不同,函数的返回值类型可以相同也可以不相同。
4.函数模板:所谓函数模板,实际上是建立一个通用函数,其函数类型和参数类型不具体指定,用一个虚拟的类型来来代表。这个通用函数称为函数模板。
template <typename T>
通用函数定义
类型参数可以不只一个,可以很据需要确定个数。如
template <typename T1,typename T2>
应注意它只适用于函数体相同,函数的参数个数相同而类型不同的情况
5.有默认参数的函数:
指定的默认值的参数必须放在形参列表中的最右端,否则出错。
两点注意:
两点注意:
一、如果函数的定义在函数的调用之前,则应该在函数的定义中给出默认值。如果函数的定义在函数的调用之后,则在函数调用之前需要有函数声明,此时必须在函数声明中给出默认值,在函数定义可以不给出默认值。
二、一个函数不能既作为重载函数又作为有默认参数的函数。因为当调用函数时如果少写一个参数,系统无法判断是利用重载函数还是利用默认参数的函数,出现二义性,系统无法执行
6.变量的存储类别
①变量属性之一作用域,作用域是从空间的角度来分析的,分为全局变量和局部变量变量属性之二存储区,是从变量值存在的时间角度分析的,分为静态存储区和动态存储区
②用static 生命的静态局部变量
(1)静态局部变量在静态存储区内分配单元。
(2)对静态局部变量是爱在编译时赋值的,即只赋值一次,在程序运行时它已有初值。以后每次调用函数时不再重新赋初值,而是保留上一次函数调用结束时的值。而对自动变量赋初值,不是在编译时进行的,而是在函数调用时进行,每调用一次就重新给一次初值,相当于执行一次赋值语句。
(3)如果在定义局部变量时部赋初值的话,对静态局部变量来说编译时自动赋初值0(对数值型变量)或空字符(对字符变量)。而对自动变量来说,如果不赋初值,则它的值是一个不确定的值。这是由于每次函数调用结束后存储单元已释放,下次调用时又重新分配存储单元,而所分配的单元中的值是不确定的。
(4)虽然静态局部变量在函数调用结束后仍然存在,但其他函数时不能引用它的,也就是说,在其它函数中它是不可见的。
③用extern声明外部变量
☞在一个文件内声明全局变量
若果在定义点之前的函数项引用该全局变量,则应该在引用之前用关键字extern对该变量做外部声明,
表示该变量时一个在下面定义的全局变量。有了此声明,就可以从生命的位置起,合法地引用该全局变量,这种声明称为提前引用声明。
☞在多文件的程序中声明外部变量
在任一文件中定义外部变量,而在另一文件中用extern对该变量做外部变量声明。
编译系统由此知道该变量是一个已在别处定义的外部变量,他首先在本文件中有无该外部变量,如果有,则将其作用域扩展到本行开始,如果本文件中无此外部变量,则在程序连接时从其他文件中到有无次外部变量,如果有,则把另一文件中定义的该变量的作用域扩展到本文件,在本文件中可以合法的引用该外部变量。
注意,ertern只是做变量声明,而不是变量定义,它只是对一个已定义的外部变量做声明,以扩展器作用域。
④用static声明静态外部变量
某些外部变量仅限于本文件引用,而不被其他文件引用,这是可以在定义外部变量时加一个static声明
不要误认为用static声明的外部变量才采用静态存储方式,而不加static声明的是动态存储。实际上,两种形式的外部变量都用静态存储方式,只是作用范围不同而已,都是在编译时分配内存的。
⑤变量属性小结
☞存储类别:auto、static、register、extern
☞作用域角度分
局部变量(自动变量、局部变量、寄存器变量、形参)
全局变量(静态外部变量-只限于本文件使用;外部变量-允许其他文件引用)
☞存储区来分
动态存储:自动变量、寄存器变量、形参
静态存储:静态局部变量、静态外部变量、外部变量
☞可见性
☞
可见性
7.变量的声明和定义
声明两种:一种是需要建立存储空间的,称为定义性声明,简称定义;一种是不需要建立存储空间的,称为引用性声明,广义地说,声明包括定义,但并非所有声明都是定义,一般为了叙述方便,把建立存储空间的声明称为定义,把不需要建立存储空间的声明称为声明。
对外部变量的初始化只能在定义时进行,而不能在声明时进行。所谓声明,其作用就是向编译系统发出一个信息,声明该变量是一个在后面定义的外部变量,仅仅是为了提前引用该变量而做的声明。Extern 只做声明不用于定义。
8.内部函数:如果一个函数只能够被本文件中其他函数多所调用,它称为内部函数。Static 类型标识符 函数名(形参表)
内部函数又称静态函数。使用静态函数,可以使函数仅限于所在文件,如果在不同的文件中有同名的内部函数,互不干扰。
外部函数:在定义函数时如果在函数首部的最左端冠以extern ,则表示此函数是外部函数,可供其他文件调用。
如果在定义时省略extern ,则默认为外部函数。
由于函数本质上是外部的,为编程方便,C++允许在声明函数时省略extern ,只要在使用该函数的每一个文件中包含该函数的函数原型即可。函数原型通知编译系统:该函数在本文件中稍后定义,或在另一文件中定义。
9.内置函数应当与调用它的语句在统一文件中,而不能分别在不同的文件中。
10.一维数组的初始化:
只给一部分元素赋值,其余元素默认为0(广义的0);例如:int a[10] = {0,1,2,3,4};在给全部元素赋值时,可以不指定数组的长度。例如:int a[] = {1,2,3,4,5};
char str[] ="I am happy" 数组的长度不是10而是11,因为字符串常量最后由系统
加上以个'\0'
12.11.数组名也可以做实参和形参,传递的是数组的起始地址。
13.常用字符串操作函数:
字符串连接函数strcat;字符串复制函数strcpy;字符串比较函数strcmp;字符串长度函数strlen
14.字符串类(string)与字符串变量
①#include<string>(无.h)
②对字符串变量赋值
string string1 = "china";string string2;string2 = "china"
char str[10];str = "Canada";//错误,str 不是字符串变量而是数组名,数组名代表数组地址,是常量,不能被赋值。
③字符串数组
string name[5] = {"zhang","li","zhou","zheng","wang"};
int a[10];
printf("%d\t%d\t%d\t%d\t%d\n",sizeof(string),sizeof(name),sizeof(name+0),sizeof(*(name+1)),sizeof(a));
分析:string name[5] = {"zhang","li","zhou","zheng","wang"};
结果:32,160,4,32,40
归纳起来,C++对字符串的处理有两种:一种是用字符数组的方法,这是C 语言采取的方法;一种是用string 类定义字符串变量。
15.指针基础
15.指针基础
①一个变量的地址称为该变量的指针;如果有一个变量是专门用来存放地址(即指针)的,则它称为指针变量。
②在Visual中,为每个指针变量都分配4个字节的存储空间。
③指针变量的基类型就是该指针变量指向的变量的类型。
④定义指针变量的一般形式:基类型* 指针变量名
在定义指针变量时必须指定基类型。
⑤一个变量的指针包括来量方面内容:一是以存储单元编号表示的地址;一是它指向的存储单元的数据类型。
⑥不能用一个整数给一个指针变量赋值,例如
int pointer = 2000; 可以改写成int *pointer = (int *)2000;
⑦&a 为变量a的地址,* p为指针变量p所指向的存储单元
⑧实参变量和形参变量之间的数据传递是单向的"值传递"方式。指针变量做函数参数也要遵循这一规则。调用函数时不会改变实参指针变量的值,但可以改变实参指针变量所指向的变量的值
16.数组与指针
①引用一个数组元素,有两种方法:下标法(a[i]);指针法(*(a + i))
②C++编译系统将形参数组名一律指针变量来处理,实际上,在函数调用时并不存在一个占有存储空间的形参数组,只有指针变量。在函数运行期间,它可以在被赋值。
实参数组名a代表一个固定的地址,或者说是指针型常量,因此要改变a的值是不可能的。
17.函数与指针
①用函数指针调用函数:函数类型( *变量名) (函数形参表),例如:int (*p)(int ,int);
②返回指针值的函数:类型名* 函数名(参数列表)
18.指针数组和指向指针的指针
①指针数组:类型名* 数组名[数组长度],例如int * p[4];不要写成int (* p )[4];这是指向一维数组的指针变量。
②指向指针的指针
char **p;
char * name[] = {"BASIC","FORTRAN","C++","Pascal","COBOL"};
p = name+2;
cout<<*p<<endl;//C++
cout<<**p<<endl;//C
①指向常量的指针变量:const 类型名* 指针变量名
不允许通过指针变量改变它指向的对象的值
不要以为只要定义了(const int *)型指针变量,就能保证期所指向的对象的值无法改变。
可以直接对原变量进行赋值,用指向常量的指针变量只是限制了通过指针变量改变它指向的对象的值。如果想绝对保证a的值始终不变,应当把a定义成常变量。
②常指针:指定指针变量的值是常量。即指针变量的指向不能改变。
类型名* const 指针变量名
指针变量的指向不能改变,但指针变量的指向变量的值可以改变。
③指向常量的常指针:const 基本类型名* const 指针变量名。指针变量指向一个固定的对象,该对象的值不能改变(指不能通过指针变量改变该对象的值,但是可以直接对该变量进行改变)
20 void 指针类型
不要把“指向void 类型”理解成指向“任何的类型”的数据,而应该理解为“指向空类型”或“不指向确定类型”的数据。
可以把void 类型的指针赋值给void 型指针变量,但不能把void指针直接赋值给非void 类型的指针变量,必须先进行强制转换。
21.指针变量可以有空值,即该指针变量不指向任何变量,p = NULL (NULL =0),即p不指
21.指针变量可以有空值,即该指针变量不指向任何变量,p = NULL (NULL =0),即p不指向任何有效的单元。P = NULL和p未赋值是两个不同概念。前者是有值的(值为0),不指向任何变量,后者虽未对p赋值但不等于p无值,只是它的值是一个无法预料的值,也就是p可能指向某一个未指定的单元。这种情况是很危险的。因此,在引用指针量之前应对它赋值。指针调用成员函数
22.引用:对一个数据可以建立一个“引用”,它的作用是为一个变量起一个别名。这是C++对C的一个重要扩充。
int &b = a;//声明了b是a的引用
在数据类型名后面出现的&是引用声明符,在其他场合出现的都是地址符。
声明一个引用时,必须同时使之初始化,即声明它代表哪一个变量。当声明一个引用时不能再使之作为另一个变量的引用。不能建立引用数组,不能建立引用的引用,可以取引用的地址。
23.引用结构体变量中成员的方式:
(1)结构体变量.成员名(2)(* p).成员名(3)p->成员名
①new 和delete 是运算符,不是函数,因此执行效率高。
②new 类型 [初值] (用new 分配数组空间时不能指定初值。如果由于内存不足等原因而无法正常分配空间,则new会返回一个空指针NULL,用户可以根据该指针的值判断分配空间是否成功)
delete 指针变量 (对变量);delete [] 指针变量 (对数组)
例子:
new int ;//开辟一个存放整数的存储空间,返回一个指向该存储空间的地址(即指针) new int(100);//开辟一个存放整数的存储空间,并指定该整数的初值为100,返回一个指向该存储空间的地址(即指针)
new char[10];//开辟一个存放字符数组(包括10个元素)的存储空间,返回一个指向该存储空间的地址(即指针)
new int[5][4];//开辟一个存放二维整型数组的存储空间,返回一个指向该存储空间的地址(即指针)
25.用typedef声明新的类型名
例子:①typedef int NUM[100];//声明NUM为整型数组类型,包含100个元素。
NUM n;//声明n为包含100个整型元素的数组
②typedef char * STRING ;//声明STRING 为char * 类型,即字符指针类型。STRING p, s[10];//定义p为char* 型指针变量,s为chat * 类型的指针数组(有10个元素)
③typedef int ( * POINTER)()
POINTER p1,p2;
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论