上一篇文章总结了java 参数传递方式。—(http://blog.csdn.net/clam_clam/article/details/6625837)
为了比较我在这里总结了C++ 的参数传递方式。
首先来看一个小程序:
#include <iostream> using namespace std; class Interger{ public: int value; Interger(int b){ this->value=b; } }; void swap(int a,int b){ int temp=a; a=b; b=temp; } void swapByReference(int &a,int &b){ int temp=a; a=b; b=temp; } void swap(Interger IntergerA, Interger IntergerB){ Interger IntergerTemp=IntergerA; IntergerA=IntergerB; IntergerB=IntergerTemp; } void changeInteger(Interger IntergerA){ IntergerA.value=100; } void main(){ int inta=5; int intb=6; cout<<"before call swap by value a : "<<inta<<" ,inta: "<<intb<<endl; swap(inta,intb); cout<<"after call swap by value a: "<<inta<<" ,intb: "<<intb<<endl; cout<<"before call swap by reference a: "<<inta<<" ,b: "<<intb<<endl; swapByReference(inta, intb); cout<<"after call swap by reference a: "<<inta<<" ,b: "<<intb<<endl; Interger IntergerA=Interger(8); Interger IntergerB=Interger(9); cout<<"before call swapInterger IntergerA: "<<IntergerA.value<<" ,IntergerB: "<<IntergerB.value<<endl; swap(IntergerA,IntergerB); cout<<"after call swapInterger IntergerA: "<<IntergerA.value<<" ,IntergerB: "<<IntergerB.value<<endl; cout<<"before call changeInteger IntergerA value: "<<IntergerA.value<<endl; changeInteger(IntergerA); cout<<"after call changeInteger IntergerA value: "<<IntergerA.value<<endl; }
calss Type{ void operation(const Type&p1,const Type&p2); int main(){ Tyoe obj1; Type obj2 = operation(obj1,0); //引用参数的实参不能为0 }所以在函数中,一个参数可能指向不同的对象的情况,或者这个参数可能不指向任何对象,则必须实用指针参数。
(2)引用参数的一个重要用法,它允许我们在有效实现重载操作符的还能保证用法的直观性。如下例:
示例 Matrix-1:
Matrix operator+(Matrix m1,Matrix m2) { Matrix result; //do computation return result; }通过上面实现后,就能够支持两个Matrix对象的加法,如:a+b
而为了提高我们的操作符函数的效率,假定我们决定把参数申明为指针的时候,如下:
示例 Matrix-2:
Matrix operator+(Matrix *m1,Matrix *m2) { Matrix result; //do computation return result; }
Matrix operator+(Matrix &m1,Matrix &m2) { Matrix result; //do computation return result; }调用的时候还经以前一样(使用习惯一样):
int main(){ void swap(int,int);//参数为整型变量 int i=3,j=4; cout<<"i="<<i<<",j="<<j<<endl; swap(i,j);//变量名 cout<<"i="<<i<<",j="<<j<<endl; system("PAUSE"); return 0; } void swap(int a,int b){//形参为整型变量 int temp; temp=a; a=b; b=temp; }
int main(){ void swap(int*,int*);//参数为整型指针变量 int i=3,j=4; cout<<"i="<<i<<",j="<<j<<endl; swap(&i,&j);//变量地址 cout<<"i="<<i<<",j="<<j<<endl; system("PAUSE"); return 0; } void swap(int *p1,int *p2){//形参为整型指针变量 int temp; temp=*p1; *p1=*p2; *p2=temp; }
int main(){ void swap(int&,int&);//参数为整型变量的引用 int i=3,j=4; cout<<"i="<<i<<",j="<<j<<endl; swap(i,j);//变量名 cout<<"i="<<i<<",j="<<j<<endl; system("PAUSE"); return 0; } void swap(int &a,int &b){//形参为引用类型 int temp; temp=a; a=b; b=temp; }
void swap(int *p1,int *p2){//形参为整型指针变量 int temp; temp=*p1; *p1=*p2; *p2=temp; }大家可以看到使用的是 temp=*p1,*p1=*p2 。这样我们 改变的是实参地址所指向的变量指。
int main(){ void swap(int*,int*);//参数为整型指针变量 int i=3,j=4; cout<<"i="<<i<<",j="<<j<<endl; swap(&i,&j);//变量地址 cout<<"i="<<i<<",j="<<j<<endl; system("PAUSE"); return 0; } void swap(int *p1,int *p2){//形参为整型指针变量 int *temp; temp=p1; p1=p2; p2=temp; }运行结果:
public static void swap(Integer ia, Integer ib) { Integer temp = ia; ia = ib; ib = temp; }看到没这两段代码都是交换形参的地址。没有影响到实参。大家可以自己拷贝到电脑上运行一下就知道了(我已经亲身测验过)。
本人才疏学浅,大家如有异议,欢迎评论。
note: 指针,引用做形参传递递参数无论是在效率上还是在空间上都是完全一样的。可以参考博客: http://blog.csdn.net/kandypig/article/details/1587221