牛骨文教育服务平台(让学习变的简单)
博文笔记

函数指针和函数返回值为引用的区别

创建时间:2016-11-19 投稿人: 浏览次数:920
//#include <stdio.h>
//int ff(int(*p)(int, int), int a, int b)//形式1:返回类型(*函数名)(参数表).原始写法,阅读不便
//{
//	return p(a, b);
//}
//
//typedef int(*Pfun)(int, int);//形式2:typedef 返回类型(*新类型)(参数表),定义函数指针类型,改进写法,易懂
//int f(Pfun p, int a, int b) 
//{
//	return p(a, b);
//}
//int add(int a, int b)
//{
//	printf("加法函数add被调用:");
//	return a + b;
//}
//int sub(int a, int b)
//{
//	printf("减法函数sub被调用:");
//	return a - b;
//}
//int main()
//{//函数指针初步应用
//	int a = 1, b = 2;
//	printf(" %d+%d=%d
", a, b, f(add, a, b));
//	printf(" %d-%d=%d
", a, b, f(sub, a, b));
//	printf(" %d+%d=%d
", a, b, ff(add, a, b));
//	printf(" %d-%d=%d
", a, b, ff(sub, a, b));
//	return 0;
//}


#include <iostream>
using namespace std;
float temp; //定义全局变量temp
float fn1(float r); //声明函数fn1
float &fn2(float r); //声明函数fn2
float fn1(float r) //定义函数fn1,它以返回值的方法返回函数值
{
	temp = (float)(r*r*3.14);
	return temp;
}
float &fn2(float r) //定义函数fn2,它以引用方式返回函数值
{
	temp = (float)(r*r*3.14);
	return temp;
}
void main() //主函数
{
	float a = fn1(10.0); //第1种情况,系统生成要返回值的副本(即临时变量)
	//float &b = fn1(10.0); //第2种情况,可能会出错(不同 C++系统有不同规定)
						  //不能从被调函数中返回一个临时变量或局部变量的引用
	float c = fn2(10.0); //第3种情况,系统不生成返回值的副本
						 //可以从被调函数中返回一个全局变量的引用
	float &d = fn2(10.0); //第4种情况,系统不生成返回值的副本
						  //可以从被调函数中返回一个全局变量的引用
	cout << a << endl;
	cout << c << endl;
	cout << d << endl;
}

总结
1、引用其实本质就是地址
2、当函数返回值类型为引用时,一般就用引用类型去接收,或者就使用了引用的作用,如果用非引用类型接受,就等于将函数返回的引用的数据值,复制给了该接收对象,和函数返回非引用类型是一样的效果。
3、当函数返回值类型为引用时,如果不考虑接收问题,则有一个特性,则是可以直接操作该函数返回的引用,如放在=左面 +=等.
4、错象:当在函数内部定义了局部变量(本质就是为一段内存取了一个名字,并占用),出了这个函数,这个局部变量不可再使用,也就是这个局部变量并不指向任何一个内存了,但是这个局部变量原来所指的内存如果没有被系统重新分配,里面的值仍然没有变,如果有一个引用指向该局部变量,在局部变量被释放内存以后,如果没有被系统重新将这段内存分配,那么其值仍可用。
5、不可以将常引用当作函数返回值返回.
6、用引用作函数参数和返回值类型的好处。直接是地址操作,不需要将值一一复制给形参,
7、返回值不需要有临时变量的存在,也不需要调用任何构造函数。节省了开销
8、一般当函数形参需要复杂类型的数据时,最好用引用,可以节省系统开销,
9、能用常引用的地方尽量用常引用。
10、如果非要返回一个局部变量的引用,可以new 类型(初值) 申请一个堆内存的临时变量,这样只要不delete释放,那么在程序退出之前内存就不会被释放,直到不再使用时便可delete掉.


阅读更多
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。