通过对象名称直接访问对象具有直观的优点,使您可以一目了然地了解正在操作的对象。 缺点是不能在一个函数内部使用另一个函数的局部变量。
通过指针(或地址)间接访问对象的优点是什么都能做。 缺点是程序中大量出现的间接访问不知道具体是什么对象。 需要在上下文中进行分析。
C扩展了C语言对象访问方式,提供了引用访问。通过引用访问对象,结合了按名访问和按地址访问各自的优点,非常适合作为函数参数
1 .作为函数参数引用
简单来说,引用是对象的别名,声明格式如下:
引用类型 引用名称=对象名称
int x; //在定义xint r=x//r声明为x的引用c中,所有引用都是const类型,声明后不能更改(即,不能再是对另一个对象的引用) )。
的规则1 )声明引用类型变量时,必须同时初始化它,以声明它是哪个对象的别名或绑定对象。
例如:
int r; //错误,引用为const类型,声明时必须初始化int x。 r=x; //正确地,r不得为x的参考2 )空参考,且参考必须与有效对象的存储器单元相关联。
3 )引用初始化后,引用关系不能改变,不能作为其他对象的引用。 例如:
int x,y; int r=x; int r=y; //错误4 )指定类型的引用无法初始化为其他类型的引用。
5 )初始化引用和赋值引用是完全不同的概念。 例如:
int x; //定义整形变量xint r=x初始化指示r是x的引用,其中r即将绑定到xr=100; //参照代入、100代入被r连接的存储单元(即x )6),取参照对象的地址与取参照对象的地址完全相同,通过取地址进行运算。 例如:
int x,r=x; //定义整形变量x,yint *p1=x; //p1指xint *p2=r; //p2指向r,扩展引用类型作为本质上指向x引用的函数形式参数c,主要是为了作为函数形式参数。 因此,在c中将参数传递给一个函数有三种方法。
1 )传达对象本身
2 )传递指向对象的指针
3 )传递对象引用
例如:
# include bits/stdc.husingnamespacestd; //1交接对象本身的voidswap(inta,int b ) {int t; t=a; a=b; b=t; (} int main ) ) { int x=10,y=20; swap(x,y ); coutx' 'y; 返回0; }运行结果: 10 20 a和x、b和y都是不同的变量xy的值,没有发生更换例2
# include bits/stdc.husingnamespacestd; //2要传递到的指针voidswap(int*a,int *b ) {int t; t=*a; *a=*b; *b=t; (} int main ) ) { int x=10,y=20; swap(x,y ); coutx' 'y; 返回0; }运行结果: 20 10例3:
# include bits/stdc.husingnamespacestd; //2传递到的引用voidswap(inta,int b )//引用是函数形式参数int; t=a; a=b; b=t; (} int main ) ) { int x=10,y=20; swap(x,y ); coutx' 'y; 返回0; } 使用引用作为函数形参,比使用指针变量简单、直观、方便减少了编程难度,尤其是在大量指针间接访问被调制函数时,更是如此。
引用作为函数返回值的函数的返回值可以是按以下方式定义的引用类型:函数返回引用:
引用类型函数名称(形参)
函数体
示例1 :
//函数返回数值# include bits/stdc.husingnamespacestd; intmax(inta,int b ) { return } ab? a:b; (} int main ) ) {int x=10,y=20,z; z=max(x,y ); coutz; 返回0; )例2
//函数返回指针# include bits/stdc.husingnamespacestd; int*max(inta,int b ) { return } ab? a:b; (} int main ) ) {int x=10,y=20,*z; z=max(x,y ); cout*z; 返回0; )例3
/p> //函数返回引用#include<bits/stdc++.h>using namespace std;int& max(int &a,int &b){return (a>b?a:b);} int main(){int x=10,y=20,z;z=max(x,y);cout<<z;return 0;}可以看出,函数返回引用与函数返回值有重大区别,它不是返回一个临时对象,而是相当于返回实体对象本身。正因为如此,函数返回引用可以作为左值。
即可以把函数调用放在赋值运算符左边
例:
函数是实现特定功能的程序代码的结合。实际上,函数代码在内存中也要占据一段内存空间(代码区内),这段存储空间的起始地址成为函数入口地址。C++规定函数入口地址为函数的指针,即函数名既代表函数,又是函数的指针(或地址)。
C++允许定义指向函数的指针变量,定义形式为:
*返回类型(函数指针变量名)(形式参数列表)
使函数指针指向函数
可以将函数的地址赋给函数指针变量,形式为:
函数指针变量=函数名;
它要求函数指针变量与指向函数必须有相同的返回类型,参数个数,参数类型
例:
则
p=max;
称p指向函数max。它也可以指向函数min,即可以指向所有与它有相同的返回类型、参数个数、参数类型的函数。
通过函数指针调用函数
对函数指针间接引用即是通过函数指针调用函数,一般形式为:
函数指针(实参列表)
通过函数指针调用函数,在实参、参数传递、返回值等方面与函数名调用相同。
例如:
指向函数的指针多用于指向不同的函数,从而可以利用指针变量调用不同函数,相当于将函数调用由静态方式(固定地调用指定函数)变为动态方式(调用哪个函数是由指针值来确定)。熟练掌握函数指针的应用,有利于程序的模块化设计,提高程序的可扩展性。