1.函数返回值与引用返回值
函数的返回值可以是引用类型。在函数普通返回值时,要创建一个临时变量用于保存函数的返回值,而用引用作为函数返回值时,则不创建临时变量。以引用类型作为函数返回值一般形式为:
数据类型& 函数名(形参列表)
【例1.18】分析下面程序错误的原因。
fun1()函数是以值的形式返回,在函数返回时要生成一个临时变量来保存函数的返回值。fun1()函数返回到main()函数后,以fun1()函数返回时所创建的临时变量对引用a进行初始化,这样a即成为该临时变量的别名。由于临时变量生命周期在“int&a =fun1(3)”语句执行结束后便结束。之后,a所引用的目标对象(临时变量)不再存在,这样a就面临无效的危险。
fun2()函数是以引用的形式返回,函数以引用的形式返回不生成返回值的副本,即不生成临时变量保存返回值,函数的返回值就存储在所返回的变量中。语句“int&b =fun2(3)”中用fun2()的返回值对引用b进行初始化,也即是用fun2()函数中的局部变量g对b进行初始,由于局部变量g的生命周期在fun2()函数调用结束也即结束。之后,再对b进行操作都是无效的。
2.函数调用作为左值
用引用作为函数返回值使得在一个赋值表达式中函数调用作为左值成为可能,但要避免将函数中的局部变量的地址返回。
【例1.19】一个整形数组中的数据,大于等于零的为A 类数据,小于零的为B类数据,统计数组中A 类数据和B类数据的个数。
该程序中fun()函数返回一个引用,为了返回一个非局部变量的引用,所以返回值为全部变量A 或B,由于返回的是引用,所以可以作为左值直接进行增量运算。
【例1.20】对一个长度为10的安全数组,定义put()函数把数值放入数组中,get()函数取出数组中某个位置的值,当下标越界时立即终止程序运行。
put()函数为返回引用型函数,这样在main()中就可以通过对put()赋值的方式把数组存入数组中,get()函数中第一个参数为读取数组元素的下标,第二个参数为引用型用来返回所读取数组元素的值。
综合实训
C++基础知识
【实训目的】
1.理解重载函数、带默认参数的使用。
2.深入理解堆内存分配。
3.深入理解引用的定义和使用。
【实训内容】
1.设计一个智能加法器,该加法器可以求两个数之和,三个数之和。当输入零个数时返回零,一个数时返回该数本身的值。
2.根据用户输入的值,动态建立给定长度的数组,给数组中的每个元素赋值,并求所有元素的平均值。
3.定义一个函数并调用它,函数的功能是根据给出的半径,返回圆的面积、圆的周长和球体积三个值。
【实训设计】
1.以重载函数实现,代码如下:
2.参考代码如下:
3.参考代码为:
项目小结
本项目主要介绍了C++语言在I/O流、函数、const常量、堆内存分配及引用等语法基础部分对C语言的扩展。通过本项目的学习,读者能够体会到C++语言中相对C 语言扩展的功能不但能提高编写程序的灵活性,也能提高程序的执行效率。
课后练习
一、选择题
1.C++对C语言做了很多改进,即从面向过程变成为面向对象的主要原因是( )。
A.增加了一些新的运算符 B.允许函数重载,并允许设置缺省参数
C.规定函数说明符必须用原型 D.引进了类和对象的概念
2.C++源程序文件的默认扩展名为( )。
A.cpp B.exe C.obj D.lik
3.为了提高程序的运行速度,可将不太复杂的功能用函数实现,此函数应选择( )。
A.内联函数 B.重载函数 C.递归函数 D.函数模板
4.适宜采用inline定义函数情况是( )。
A.函数体含有循环语句 B.函数体含有递归语句
C.函数代码少、频繁调用 D.函数代码多、不常调用
5.cout是I/O流库预定义的( )。
A.类 B.对象 C.包含文件 D.常量
6.采用重载函数的目的是( )。
A.实现共享 B.减少空间
C.提高速度 D.使用方便,提高可读性
7.函数重载是指( )。
A.两个或两个以上的函数取相同的函数名,但形参的个数或类型不同
B.两个以上的函数取相同的名字和具有相同的参数个数,但形参的类型可以不同
C.两个以上的函数名字不同,但形参的个数或类型相同
D.两个以上的函数取相同的函数名,并且函数的返回类型相同
8.下列有关重载函数的说法中正确的是( )。
A.重载函数必须具有不同的返回值类型
B.重载函数参数个数必须相同
C.重载函数必须有不同的形参列表
D.重载函数名可以不同
9.对于定义重载函数的下列要求中,错误的是( )。
A.要求参数的个数不同 B.要求参数中至少有一个类型不同
C.要求参数个数相同时,参数类型不同 D.要求函数的返回值不同(www.daowen.com)
10.以下设置默认值的函数原型声明中错误的是( )。
A.int add(int x =3,int y=4,int z=5);
B.int add(int x,int y=4,int z);
C.int add(int x,int y=4,int z=5);
D.int add(int x,int y,int z=5);
11.下列重载函数不正确的是( )。
12.下列( )的调用方式是引用调用。
A.形参和实参都是变量 B.形参是指针,实参是地址值
C.形参是引用,实参是变量 D.形参是变量,实参是地址值
13.以下叙述中正确的是( )。
A.使用#define可以为常量定义一个名字,该名字在程序中可以再赋另外的值
B.使用const定义的常量名有类型之分,其值在程序运行时是不可改变的
C.在程序中使用内联函数使程序的可读性变差
D.在定义函数时可以在形参表的任何位置给出缺省形参值
14.下列对引用的陈述中不正确的是( )。
A.每一个引用都是其所引用对象的别名,因此必须初始化
B.形式上针对引用的操作实际上作用于它所引用的对象
C.一旦定义了引用,一切针对其所引用对象的操作只能通过该引用间接进行
D.不需要单独为引用分配存储空间
15.假定指针变量p定义为“int∗p=new int(100);”,要释放p所指向的动态内存,应使用语句( )。
A.delete p; B .delete∗p; C.delete&p; D.delete[]p;
16.假定指针变量p定义为“int∗p=new int[30];”,要释放p所指向的动态内存,应使用语句( )。
A.delete p; B.delete∗p; C.delete&p; D.delete[]p;
17.假设已有定义const char∗name=“chen”;下列语句中错误的是( )。
A.name[3]=‘A’; B.name=“lin”;
C.name=new char[5]; D.cout< <name[2];
18.假定变量x定义为“int x=5;”,要使rx成为x的引用(别名),rx应定义为( )。
A.int rx=x; B.int rx=&x; C.int∗rx=&x; D.int&rx=x;
19.要禁止修改指针p 本身,又要禁止修改p 所指向的数据,这样的指针应定义
为( )。
A.const char∗p =“ABCD”; B.char const∗p=“ABCD”;
C.char∗const p=“ABCD”; D.const char∗const p=“ABCD”
20.关于new 运算符的下列描述中,错误的是( )。
A.使用它创建的对象或对象数组可以使用运算符delete删除
B.它可以用来动态创建对象和对象数组
C.使用它创建对象数组时必须指定初始值
D.使用它创建对象时要调用构造函数
21.下面引用的方法中,错误的是( )。
二、编程题
1.使用I/O流输出语句,分三行输出“My name is Jone”,“the ID is”,“2”。
2.分别用浮点、定点和指数方式显示22.0/7的计算结果。
3.分别用16、8、10进制显示输出十进数1001。
4.分别用显示宽度为2,3,4显示输出21,其中用“∗”填充间隔。
5.分别用左对齐、右对齐两种方式显示输出1,2,3三个数。
6.输入圆的半径,计算并输出它的周长和面积。其中π=3.1415926,使用常量定义π。
7.编写一个C++程序,利用内联函数circle Area函数提示用户输入圆的半径,计算和打印圆的面积。
8.编写一个内联函数用于求3个数中的最大数。
9.使用内联函数的方式,定义一个把输入的字符由大写转化为小写,小写转化为大写的函数。要求在主函数中输入字符,调用此内联函数。
10.定义一组重载函数计算数组各元素的和,重载函数要求能处理的数组类型包括int,double和long。
11.定义一个带默认参数值为5的函数求n!。
12.用new 运算符从堆中获取一个整数数组,赋值并打印。
13.要求在堆空间分配5个整型变量空间,分别存放100,200,300,400,500,要求把这个五个数倒序输出,即输出500,400,300,200,100。(要求使用new 和delete操作符分配和回收堆空间)
资源推荐
1.C++网站 http://www.cplusplus.com
2.C++类库参考 https://msdn.microsoft.com/zh-cn/library/cscc687y.aspx
3.百度传课 http://www.chuanke.com/course/72351176561000448______2.html
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。