




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第第5 5章章 函数与函数模板函数与函数模板n在以模块化方式设计一个较大的程序时,在以模块化方式设计一个较大的程序时,需要对复杂功能进行分解,形成若干容易需要对复杂功能进行分解,形成若干容易处理和编码的相对独立的程序块,而最终处理和编码的相对独立的程序块,而最终要精心实现的就是这些小而容易的程序块,要精心实现的就是这些小而容易的程序块,称为称为“模块模块”,C+中称之为函数。中称之为函数。 5.1 函数的定义与声明函数的定义与声明5.1.1 函数定义函数定义ntype 函数名函数名(形式参数说明表形式参数说明表)nn /代码,称为函数体代码,称为函数体nn上述工作的目的是指规定一个函数的名字、
2、上述工作的目的是指规定一个函数的名字、参数等信息,并给出实现它的完整代码,参数等信息,并给出实现它的完整代码,此过程称为此过程称为“函数定义函数定义”或或“函数实现函数实现”。 5.1.1 函数定义函数定义n一个程序中可能包含很多个函数,所有函一个程序中可能包含很多个函数,所有函数无主次之分,单独定义,数无主次之分,单独定义,不能在一个函不能在一个函数的函数体内再定义另一个函数,数的函数体内再定义另一个函数,这一点这一点称为函数的称为函数的“外部性外部性”。一个完整的程序。一个完整的程序必须有一个名字为必须有一个名字为main的函数,它起着程的函数,它起着程序入口的作用。即程序从序入口的作用。
3、即程序从main函数的第一函数的第一条语句开始执行,条语句开始执行,main函数执行完毕意味函数执行完毕意味着整个程序运行结束。着整个程序运行结束。 5.1.2 函数声明函数声明n自定义函数的声明自定义函数的声明用户定义的函数应按下述两种形式之一进行声明,效果用户定义的函数应按下述两种形式之一进行声明,效果相同:相同:ntype 函数名函数名(形式参数说明表形式参数说明表);ntype 函数名函数名(形式参数类型说明表形式参数类型说明表);例如:例如:ndouble f(double x, double y);double f(double x, double y);ndouble f(dou
4、ble, double);double f(double, double);声明是为了说明函数的格式,参数的名字无关紧要。声明是为了说明函数的格式,参数的名字无关紧要。 在函数定义置于使用之前时也可以不声明,但一般只在在函数定义置于使用之前时也可以不声明,但一般只在简单程序中采取这种做法。简单程序中采取这种做法。 5.1.2 函数声明函数声明n库函数的声明库函数的声明C+语言的库函数是预先设计的函数,它们的语言的库函数是预先设计的函数,它们的原型声明都分类存储在随系统携带的某个头文原型声明都分类存储在随系统携带的某个头文件中,需要使用件中,需要使用#include指令指令“包含包含”对应的对应
5、的文件,文件,使编译器可以查找到所使用函数的声明使编译器可以查找到所使用函数的声明。 学习时应注意了解库函数和它所在的头文件。学习时应注意了解库函数和它所在的头文件。 5.2 函数调用与参数匹配函数调用与参数匹配n如果仅给出一个函数的定义和声明,并不如果仅给出一个函数的定义和声明,并不意味着函数的代码能够被执行。只有程序意味着函数的代码能够被执行。只有程序的其它部分使用该函数时,系统才会真正的其它部分使用该函数时,系统才会真正执行函数的代码,这种使用称为执行函数的代码,这种使用称为“函数调函数调用用”。 5.2.1 调用关系调用关系#include using namespace std;do
6、uble sum(double, double);/函数原型声明函数原型声明void print(double); /函数原型声明函数原型声明int main( ) print(sum(1.0, 2.0);double sum(double x, double y) return x+y;void print(double x) cout x= x endl;5.2.2 函数返回控制与函数调用表达式函数返回控制与函数调用表达式n函数返回控制函数返回控制当一个函数的代码执行后,有两种情况意味着函数执行当一个函数的代码执行后,有两种情况意味着函数执行完毕并返回到调用函数。完毕并返回到调用函数。n执
7、行完函数的所有代码;执行完函数的所有代码;n执行到一个执行到一个return语句。语句。 return语句有以下两种语法形式:语句有以下两种语法形式:nreturn;nreturn expression;如果函数中通过如果函数中通过“return expression;”形式返回,则函数形式返回,则函数应该是表达式应该是表达式expression所具有的类型所具有的类型,否则为,否则为void类型。类型。标准标准C+中的中的main函数函数有点特殊,尽管被建议是有点特殊,尽管被建议是int类型,类型,但即使但即使没有没有return语句带回值,也不会得到警告错误语句带回值,也不会得到警告错误。
8、 5.2.2 函数返回控制与函数调用表达式函数返回控制与函数调用表达式n参数对应参数对应n当执行被调用函数的代码时,形参变量的当执行被调用函数的代码时,形参变量的值就等于实参数的值。应保证实参数与形值就等于实参数的值。应保证实参数与形式参数在数量、类型、顺序上的严格匹配。式参数在数量、类型、顺序上的严格匹配。5.2.2 函数返回控制与函数调用表达式函数返回控制与函数调用表达式n函数调用表达式函数调用表达式void类型的函数类型的函数 普通数据类型的函数普通数据类型的函数 返回指针或引用的函数返回指针或引用的函数 5.2.2 函数返回控制与函数调用表达式函数返回控制与函数调用表达式n参数的默认值
9、参数的默认值对于一些常用的实参数值,可以说明为默认值对于一些常用的实参数值,可以说明为默认值(缺省值),如果调用时没有给出实参数则使(缺省值),如果调用时没有给出实参数则使用声明或定义中的默认值做实参数。用声明或定义中的默认值做实参数。 nvoid printImage(int r=3, int c=4, char cx=*); nprintImage( );/34的的*图形图形nprintImage(4);/44的的*图形图形在不能为所有参数指定默认值时,必须按由右在不能为所有参数指定默认值时,必须按由右至左的顺序提供默认值。同时有定义、声明时,至左的顺序提供默认值。同时有定义、声明时,要要
10、在声明中指定缺省值而不是在定义中在声明中指定缺省值而不是在定义中,否则,否则会引起语法错误。会引起语法错误。 5.2.2 函数返回控制与函数调用表达式函数返回控制与函数调用表达式n参数的计算顺序参数的计算顺序实参数表达式先按由右至左的顺序被计算出值,实参数表达式先按由右至左的顺序被计算出值,然后再逐个复制给形式参数。然后再逐个复制给形式参数。例如:例如:void outdata(int x, int y) cout x , y endl; 注意:注意:实际参数的计算次序与数据的输出次序实际参数的计算次序与数据的输出次序是不同的含义。是不同的含义。 若用语句若用语句int y = 10;outd
11、ata(y+1, y+);调用。调用。5.3 参数的传递方式参数的传递方式nC+的函数参数有的函数参数有2种传递方式种传递方式传值和引用,传值又可以细分为传递普通数据传值和引用,传值又可以细分为传递普通数据和指针。和指针。 5.3.1 普通传值方式普通传值方式n以传值规则处理参数会导致一个明显的结以传值规则处理参数会导致一个明显的结论:论:形式参数的改变与实际参数无关,即形式参数的改变与实际参数无关,即形参的变化不会影响实参变量的值。形参的变化不会影响实参变量的值。 5.3.2 传递指针方式传递指针方式n使用指针做函数参数的特殊作用使用指针做函数参数的特殊作用利用指针做函数参数主要有二个目的:
12、利用指针做函数参数主要有二个目的:n在调用函数中定义变量(准备存储空间)。在调用函数中定义变量(准备存储空间)。被调用被调用函数使用参数接收此变量的地址(指针),再以间函数使用参数接收此变量的地址(指针),再以间接引用方式将一个值写入该地址空间。接引用方式将一个值写入该地址空间。n提高效率。提高效率。在有连续存放的多个数据或一个复杂的在有连续存放的多个数据或一个复杂的数据(如对象)需要传递给函数时,可以传递数据数据(如对象)需要传递给函数时,可以传递数据区的首地址。区的首地址。 int calcSum(int* x, int count) int sum = 0, k; for(k=0; kc
13、ount; k+) sum += xk; return sum;int a100 = .; /一个已赋值的数组一个已赋值的数组cout calcSum(a, 100); /所有所有100个元素的和个元素的和cout calcSum(a+30, 20);/下标下标30开始的开始的20个元素的和个元素的和5.3.2 传递指针方式传递指针方式nmain函数中的参数函数中的参数C+的的main函数可以使用包含二个参数(甚至函数可以使用包含二个参数(甚至更多)的扩展形式:更多)的扩展形式:nint main(int argc, char* argv);n其中其中argv是一个指针数组(字符串数组),是一
14、个指针数组(字符串数组),argc是是数组数组argv的长度,即元素个数。的长度,即元素个数。 main函数的实参数来自于命令行(在函数的实参数来自于命令行(在DOS窗口窗口下以字符方式执行程序的形式)而不是程序运下以字符方式执行程序的形式)而不是程序运行时的输入。行时的输入。见例见例test_maintest_main。 5.3.3 传递引用方式传递引用方式n以引用做函数参数是引用的主要作用之一。以引用做函数参数是引用的主要作用之一。如果采用引用作函数参数,如果采用引用作函数参数,C+不建立形参不建立形参副本副本,即形式参数是对实参数的引用,没,即形式参数是对实参数的引用,没有自己的存储空间
15、,或者说形参被捆绑到有自己的存储空间,或者说形参被捆绑到实参数的地址上。因此,实参数的地址上。因此,函数中对形式参函数中对形式参数的修改就是对实参数的修改。数的修改就是对实参数的修改。n见例见例swapswap。 5.4 特殊的函数返回值特殊的函数返回值n1 返回指针的函数返回指针的函数 n2 返回引用的函数返回引用的函数 5.4.1 返回指针的函数返回指针的函数n语法和作用语法和作用一个函数可以返回某个数据的存储地址,即指一个函数可以返回某个数据的存储地址,即指向某个数据的指针。此时,函数一般具有如下向某个数据的指针。此时,函数一般具有如下原型:原型:ntype* 函数名函数名(形式参数说明
16、表形式参数说明表);函数返回指针的主要目的是提高效率和灵活性。函数返回指针的主要目的是提高效率和灵活性。 5.4.1 返回指针的函数返回指针的函数例如,将一个字符串中的小写字母都转换为大写字母例如,将一个字符串中的小写字母都转换为大写字母 #include using namespace std;char* toupper(char* s) for(char* t=s; *t; t+) if(*t=a & *t=z) *t += A - a; return s;int main( ) char s = Hello Tom; cout toupper(s) endl;5.4.1 返回指针的函数返
17、回指针的函数n使用使用const的限定的限定如果函数返回值为指针类型,则函数调用表达式代表如果函数返回值为指针类型,则函数调用表达式代表一个指针,因此,可以通过该指针进行间接引用,如:一个指针,因此,可以通过该指针进行间接引用,如:nchar s = Hello Tom;char s = Hello Tom;n* *toupper(s) = A;toupper(s) = A;ncout s endl;cout s endl;这样的应用实例并不多见,从安全性考虑,有时需要这样的应用实例并不多见,从安全性考虑,有时需要禁止这种访问。为此,可以使用禁止这种访问。为此,可以使用const进行限定,如:
18、进行限定,如:nconst char* toupper(char* s); 5.4.1 返回指针的函数返回指针的函数n字符串操作函数字符串操作函数char *strcpy(char *dest, const char *src);/将将src复制到复制到dest,返回返回destchar *strcat(char *dest, const char *src);/将将src连接到连接到dest之后,返回之后,返回destchar *strstr(const char *s1, const char *s2);/在在s1中查找中查找s2是否存在,若存在,返回第一次出现的位置,否则是否存在,若存在
19、,返回第一次出现的位置,否则返回返回0(空指针)(空指针)n此外,还有一些以字符串指针为参数的函数,如:此外,还有一些以字符串指针为参数的函数,如:int strlen(const char *s);/计算字符串计算字符串s的实际长度的实际长度int strcmp(const char* s1, const char* s2);/比较字符串比较字符串s1和和s2的大小。相等时返回的大小。相等时返回0,s1大时返回正数,大时返回正数,s1小小时返回负数时返回负数n使用上述函数时应添加使用上述函数时应添加“#include”指令。指令。 5.4.1 返回指针的函数返回指针的函数n例:从键盘输入两个
20、字符串例:从键盘输入两个字符串s和和t,并将并将t在在s中的第一次出现中的第一次出现删除。删除。 #include #include using namespace std;int main() char s100, t100; cin s t; char* pos = strstr(s, t); if(pos != 0) strcpy(pos, pos + strlen(t); cout s;5.4.1 返回指针的函数返回指针的函数n用用strcpy和和strcat时最容易出现的错误是未时最容易出现的错误是未初始化的指针和空间不足的问题初始化的指针和空间不足的问题 。char *s, t10
21、;strcpy(s, “string”);/错误,错误,s是空悬指针是空悬指针strcpy(t, “string”);/正确正确strcpy(t, “this is a string”);/错误,错误,t的空间长度不够的空间长度不够char* s1 = Hello, s2 = Hello;strcat(s1, Tom); /错误,错误,s1没有足够的存储空间没有足够的存储空间strcat(s2, Tom); /错误,错误,s2没有足够的额外空间没有足够的额外空间 5.4.1 返回指针的函数返回指针的函数n返回复杂对象的指针返回复杂对象的指针一个复杂对象意味着较大的数据量,如果以指一个复杂对象意
22、味着较大的数据量,如果以指针代替普通对象会明显提高效率,如:针代替普通对象会明显提高效率,如: string* func(string& s) /string是是C+定义的字符串类型定义的字符串类型 . return &s;/返回对象的地址返回对象的地址 5.4.2 返回引用的函数返回引用的函数n语法语法函数的原型为:函数的原型为:ntype& 函数名函数名(形式参数说明表形式参数说明表);返回引用的函数带回对某个变量的引用,相当返回引用的函数带回对某个变量的引用,相当于只带回变量的地址(但不能做地址使用),于只带回变量的地址(但不能做地址使用),其效率方面的优势是明显的。其效率方面的优势是明
23、显的。 5.4.2 返回引用的函数返回引用的函数例:下面的函数例:下面的函数conv将一个整数转换成不小于它的偶数。将一个整数转换成不小于它的偶数。#include using namespace std;int& conv(int& a) a = (a%2? a+1: a);/值为奇数时加值为奇数时加1 return a;/返回引用返回引用aint main( ) int x = 3; conv(x)+;/x加加1,即,即4加加1 cout x b ? a : b ; 5.6 内联函数内联函数n如果一个函数被指定为内联函数,它将在如果一个函数被指定为内联函数,它将在程序中每个调用点上被内联地
24、展开。例如:程序中每个调用点上被内联地展开。例如:int maxV = max(3+2,7)+max(i, j);n在编译时被展开为:在编译时被展开为:int maxV = (5 7 ? 5 : 7)+(i j ? i : j);5.6 内联函数内联函数n在定义内联函数时应注意两方面的问题:在定义内联函数时应注意两方面的问题: inline只是对编译器的只是对编译器的建议建议而非命令。因此,内而非命令。因此,内联函数应是结构简单、语句短小的函数,联函数应是结构简单、语句短小的函数,不能不能在内联函数中使用流程控制语句,也不能含有在内联函数中使用流程控制语句,也不能含有递归调用递归调用。 内联函
25、数必须在调用该函数的每个文本文件中内联函数必须在调用该函数的每个文本文件中定义,第一次调用前必须有冠以定义,第一次调用前必须有冠以inline的声明或的声明或定义。因此,在有定义和声明时,保险的做法定义。因此,在有定义和声明时,保险的做法是都加上是都加上inline关键字。关键字。 5.7 函数重载函数重载n由于函数重载使一个名字具有由于函数重载使一个名字具有“多种功多种功能能”,被认为是具有,被认为是具有“多种形态多种形态”性质。性质。这是面向对象程序设计技术中的一个十分这是面向对象程序设计技术中的一个十分重要的特征重要的特征多态性多态性。 n函数重载允许多个函数共享同一个函数名,函数重载允
26、许多个函数共享同一个函数名,其主要目的是针对不同参数类型提供相同其主要目的是针对不同参数类型提供相同的操作。的操作。 5.7 函数重载函数重载n1 函数重载的实现函数重载的实现 利用函数重载技术,我们可以用相同的函数名定义出不同的函数:int max(int v1, int v2) return v1v2?v1:v2; int max(int v1, int v2, int v3) int v12 = v1v2?v1:v2; return v12v3?v12:v3;double max(double v1, double v2) return v1v2?v1:v2; const char* m
27、ax(const char* s1, const char* s2) return strcmp(s1, s2)0?s1:s2; 5.7 函数重载函数重载n2 重载函数中的问题重载函数中的问题在语法上,函数的形式不同是指重载的函数必在语法上,函数的形式不同是指重载的函数必须具有不同的形式参数表,即不同的参数类型、须具有不同的形式参数表,即不同的参数类型、数量或顺序。数量或顺序。返回类型不同不能作为区分函数的依据,即不返回类型不同不能作为区分函数的依据,即不能重载参数表相同而只有返回值不同的函数。能重载参数表相同而只有返回值不同的函数。void func(int x, int y); int f
28、unc(int a, int b); /错误的重载错误的重载5.7 函数重载函数重载n重载函数最主要的目的是为了应付不同的数据类重载函数最主要的目的是为了应付不同的数据类型,各重载函数应该执行一致的操作。型,各重载函数应该执行一致的操作。n如果仅是参数个数不同,可以借助参数的如果仅是参数个数不同,可以借助参数的缺省值缺省值来处理而不是进行函数重载。来处理而不是进行函数重载。n例如,对于如下的重载函数:例如,对于如下的重载函数:int setData(int);int setData(int, int);n可以考虑用如下的一个函数代替:可以考虑用如下的一个函数代替:int setData(int
29、, int=0);5.8 指向函数的指针指向函数的指针n1 函数指针函数指针任何一个函数在编译后都对应一系列的指令,这些指任何一个函数在编译后都对应一系列的指令,这些指令在内存中占据一块连续的存储单元,粗略地说,其令在内存中占据一块连续的存储单元,粗略地说,其中第一条指令的地址被称为函数的中第一条指令的地址被称为函数的“入口地址入口地址”,函,函数的一次调用就是通过将函数的入口地址写入程序计数的一次调用就是通过将函数的入口地址写入程序计数器完成的。数器完成的。函数的入口地址被称为指向函数的指针。函数的入口地址被称为指向函数的指针。在在C+中,一个函数的名字代表了函数的入口地址,即中,一个函数的
30、名字代表了函数的入口地址,即函数名是指向该函数的指针。例如,若有如下函数定函数名是指向该函数的指针。例如,若有如下函数定义:义:void func(int x) 则函数名则函数名func是指向此函数代码的指针,系统的每次是指向此函数代码的指针,系统的每次函数调用都使用了这一指针。函数调用都使用了这一指针。 5.8 指向函数的指针指向函数的指针n2 指向函数的指针变量指向函数的指针变量指向函数的指针变量。一般定义形式如下:指向函数的指针变量。一般定义形式如下:ntype (*变量名变量名)(形参说明表形参说明表);例如,为了存储函数指针例如,为了存储函数指针func,应按如下形式应按如下形式定义
31、变量:定义变量:nvoid (*fpx)(int x);nfpx = func;如果需要明确描述出某种类型的函数指针,可如果需要明确描述出某种类型的函数指针,可以先用以先用typedef进行定义:进行定义:ntypedef void (*fpx)(int); nfpx p1, p2, pa5; 5.8 指向函数的指针指向函数的指针n3 函数指针的赋值函数指针的赋值由于函数指针的特殊性,所以允许参与的运算由于函数指针的特殊性,所以允许参与的运算主要是赋值和调用函数。主要是赋值和调用函数。 double (*fpx)(double);fpx = sin; void func(double (*fp
32、x)(double); func(sin); /通过参数传递给函数通过参数传递给函数 5.8 指向函数的指针指向函数的指针n4 通过函数指针调用函数通过函数指针调用函数如果如果p是一个函数指针,利用是一个函数指针,利用“*p”或或“p”都都可以表示它指向的函数(这是指向函数指针所可以表示它指向的函数(这是指向函数指针所特有的性质)。特有的性质)。 nx = sin(0.5); /角度应采用弧度表示角度应采用弧度表示ny = (*sin)(0.35); 5.8 指向函数的指针指向函数的指针n一个应用范例一个应用范例使用函数指针的主要用途之一是将一个函数传递给另一个函数。使用函数指针的主要用途之一
33、是将一个函数传递给另一个函数。下面的代码构造了一个函数下面的代码构造了一个函数calcMax,功能是计算出任何数学函数功能是计算出任何数学函数在指定区间上的近似最大值。在指定区间上的近似最大值。 y0 a b x图 求函数的近似最大值5.9 函数模板函数模板n函数重载的技术提供两个同名函数定义的目的仅函数重载的技术提供两个同名函数定义的目的仅是为了使名字是为了使名字func能够对不同数据类型有效,但能够对不同数据类型有效,但是,要想对于是,要想对于int和和float数据的组合都给出重载函数据的组合都给出重载函数的定义是非常麻烦甚至是不现实的。数的定义是非常麻烦甚至是不现实的。n如果能够使参数
34、的类型也参数化,我们可以用一如果能够使参数的类型也参数化,我们可以用一个既包含类型参数又包含数据参数的更通用的函个既包含类型参数又包含数据参数的更通用的函数定义来代替一组重载函数,如:数定义来代替一组重载函数,如:void func(type x, type y);n其中的类型可以在调用函数时指定。这样的其中的类型可以在调用函数时指定。这样的“函函数数”称为称为函数模板函数模板。 5.9.1 函数模板定义函数模板定义n函数模板的语法函数模板的语法template / 也可用也可用class Type max(Type v1, Type v2) return v1v2?v1:v2; n如果使用多
35、个模板类型参数用逗号分隔成列如果使用多个模板类型参数用逗号分隔成列表形式。如:表形式。如: template void func1(T1 a, T2 b);/必须重新声明模板参数必须重新声明模板参数template T1 func2(T2 x, T1 y, int z);5.9.1 函数模板定义函数模板定义n定义与声明中均需重新声明模板类型参数定义与声明中均需重新声明模板类型参数 template Type max(Type v1, Type v2);template Type max(Type v1, Type v2) return v1v2?v1:v2; 5.9.2 模板函数调用模板函数调
36、用n由编译器根据实参数进行类型推断由编译器根据实参数进行类型推断 double x = max(1.0, 3.0); Type max(Type v1, Type v2) n采用显式指定模板实参的方式来调用模板采用显式指定模板实参的方式来调用模板函数,其形式为:函数,其形式为:模板函数名模板函数名(实参数列表实参数列表) int x = max(1, 3);double x = max(1.0, 3.0);func2(2, 1.5, 10); 编译器利用用户指定的类型代替函数中的模板类型参数生成对应编译器利用用户指定的类型代替函数中的模板类型参数生成对应的函数版本。我们只要将的函数版本。我们只
37、要将max、max、func2看作是一个完整的函数名就可以了。看作是一个完整的函数名就可以了。 5.9.2 模板函数调用模板函数调用n在模板类型参数的声明中除了类型外,还可以包在模板类型参数的声明中除了类型外,还可以包含常量。例如:含常量。例如:template bool isBetween(AnyType x) return (x=begin & x=end ? true : false);n这里的这里的begin和和end都应以常量作为实参提供在模都应以常量作为实参提供在模板类型参数列表中,如:板类型参数列表中,如:cout isBetween(35)endl;5.9.3 模板函数重载模板
38、函数重载n模板函数可以像普通函数一样重载。例如:模板函数可以像普通函数一样重载。例如:template Type max(Type v1, Type v2) return v1v2?v1:v2; template Type max(Type v1, Type v2, Type v3) Type v12 = (v1v2?v1:v2); return (v12v3?v12:v3);char* max(char* v1, char* v2) return strcmp(v1, v2)0? v1 : v2;cout max(1.2, 3.0) max(hello, heLLo) max(3,1,2);
39、 5.10 变量的存储属性变量的存储属性nC+将程序使用的内存划分为将程序使用的内存划分为4个区域:个区域:代代码区、静态区、栈区和堆区。码区、静态区、栈区和堆区。n一个变量定义可以包含一个变量定义可以包含4种存储属性中的一种存储属性中的一种:种:extern(外部)、外部)、static(静态)、静态)、auto(自动)和自动)和register(寄存器)。寄存器)。n具有不同存储属性的变量定义位置也有差具有不同存储属性的变量定义位置也有差异。异。 5.10 变量的存储属性(续)变量的存储属性(续)n外部变量和静态变量存储在外部变量和静态变量存储在静态区静态区,其特,其特点有:点有:生存期长
40、。在变量构建后,一直存在,在整个生存期长。在变量构建后,一直存在,在整个程序运行结束后才拆除,属于永久性变量;程序运行结束后才拆除,属于永久性变量;初始化只在第一次执行到变量定义语句时进行初始化只在第一次执行到变量定义语句时进行一次。一次。在没有明确提供初始化值时,由系统赋予在没有明确提供初始化值时,由系统赋予0值值。5.10 变量的存储属性(续)变量的存储属性(续)n自动变量存储在自动变量存储在栈区栈区,其特点是:,其特点是:生存期短。自动变量在一个局部的块内定义,生存期短。自动变量在一个局部的块内定义,在程序运行离开块时被拆除,属于临时性变量;在程序运行离开块时被拆除,属于临时性变量;每次进入块时重新构建自动变量并进行初始化;每次进入块时重新构建自动变量并进行初始化;在没有明确提供初始化值时,值不可预测。在没有明确提供初始化值时,值不可预测。 5.10 变量的存储属性(续)变量的存储属性(续)n动态分配的变量存储在动态分配的变量存储在堆区堆区,在使用,在使用delete释放或程序运行结束时拆除。释放或程序运行结束时拆除。n寄存器变量寄存器变量保存在寄存器而不是内存中,保存在寄存器而不是内存中,特点是处理速度较快,通常作为循环的控特点是处理速度较快,通常作为循环的控制变量,但由于制变量,但由于C+本身能够对代码进行优本身能够对代码进行优化而较少使用。化
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 梯形(教学设计)-2023-2024学年四年级下册数学西师大版
- 八年级历史下册 第二学习主题 社会主义道路的探索 第5课 艰苦创业的民族脊梁说课稿4 川教版
- 四年级信息技术下册 使用压缩软件 2说课稿 冀教版
- 2024-2025学年新教材高中生物 第五章 细胞的能量供应和利用 第2节 1 细胞的能量“货币”ATP(2)说课稿 新人教版必修1
- 湖南省桑植县贺龙中学高中音乐《第三单元 鼓舞弦动-丰富的民间器乐》第六节 鼓乐铿锵 教案
- 10《苏武传》教学设计 2024-2025学年统编版高中语文选择性必修中册
- 2025年初中生物学教师招聘考试模拟试卷及参考答案
- 2025年秋新人教版数学三年级上册全册同步教学设计
- 4.2.1元素周期律教学设计 2023-2024学年高一上学期化学人教版(2019)必修第一册
- 2025年中考化学试题分类汇编:坐标图像题(第2期)原卷版
- 诚信展业与法律法规月演示
- 《发展汉语(第二版)中级综合(Ⅰ)》第7课+课件
- 人美版小学美术三年级上册教学计划
- 数据结构与算法课程设计 教学大纲
- GB/T 17622-2008带电作业用绝缘手套
- 笔记本电脑的组成与常用维护维修方法
- 学会沟通学会表达课件
- 针灸血肿课件
- 人教部编版道德与法治九年级下册教材解读及单元目标
- 财务尽职调查工作方案
- 焊接和切割作业的防火、防爆措施
评论
0/150
提交评论