C++引用的引用参数
1、传递可变参数
传统的c中,函数在调用时参数是通过值来传递的,这就是说函数的参数不具备返回值的能力。
所以在传统的c中,如果需要函数的参数具有返回值的能力,往往是通过指针来实现的。比如,实现
两整数变量值交换的c程序如下: void swapint(int *a,int *b){int temp;temp=*a;*a=*b;*b=temp;}使用引用机制后,以上程序的c++版本为: void swapint(int &a,int &b){int temp;temp=a;a=b;b=temp;}调用该函数的c++方法为:swapint(x,y); c++自动把x,y的地址作为参数传递给swapint函数。
2、给函数传递大型对象
当大型对象被传递给函数时,使用引用参数可使参数传递效率得到提高,因为引用并不产生对象的
副本,也就是参数传递时,对象无须复制。下面的例子定义了一个有限整数集合的类: const maxCard=100;Class Set{int elems[maxCard];//集合中的元素,maxCard表示集合中元素个数的最大值。int card;//集合中元素的个数。public:Set(){card=0;}//构造函数friend Setoperator *(Set,Set);//重载运算符号*,用于计算集合的交集用对象作为传值参数//friendSetoperator*(Set&,Set&)重载运算符号*,用于计算集合的交集用对象的引用作为传值参数...}先考虑集合交集的实现 Setoperator *(Set Set1,Set Set2){Set res;for(int i=0;i<Set1.card;++i)for(int j=0;j>Set2.card;++j)if(Set1.elems[i]==Set2.elems[j]){res.elems[res.card++]=Set1.elems[i];break;}returnres;}由于重载运算符不能对指针单独操作,我们必须把运算数声明为 Set 类型而不是 Set * 。
每次使用*做交集运算时,整个集合都被复制,这样效率很低。我们可以用引用来避免这种情况。 Setoperator *(Set& Set1,Set& Set2){Set res;for(int i=0;i<Set1.card;++i)for(int j=0;j>Set2.card;++j)if(Set1.elems[i]==Set2.elems[j]){res.elems[res.card++]=Set1.elems[i];break;}returnres;}