1.传值
void Swap(int a,int b) { int tmp=a; a=b; b=tmp; } int main() { int a=10; int b=20; Swap(a,b); return 0; }优点:形参不影响实参(保护实参),可读性强。 缺点:不能通过形参改变实参,效率低(需要用实参拷贝形参)。 2.传地址
void Swap(int* a,int* b) { int tmp=*a; *a=*b; *b=*tmp; } int main() { int a=10; int b=20; Swap(&a,&b); return 0; }优点:可以通过形参改变外部的实参 效率高(不会创建副本)。 缺点 : 不安全,可读性差。
C++为我们提供了新的一种传值方法—>传引用.
概念:引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。
形式:类型& 引用变量名(对象名)=引用实体;
int main() { int a = 10; int b = 30; int& ra = a;//类型& 引用变量名(对象名)=引用实体; cout << &ra << " = " << &a << endl; ra = 20;//a将被修改为20 return 0; }注意:引用类型必须和引用实体是同种类型的。
1.可以做函数的形参
void Swap(int& a,int& b) { int tmp=a; a=b; b=tmp; } int main() { int a=10; int b=20; Swap(a,b); return 0; }可以做到通过形参修改实参的值,而且不易出错,效率也高。
2.可以作为返回值的类型:只要返回的变量生命周期比函数长就行。
int& Add(int left, int right) { int ret= left + right; return ret; } int main() { int a = 10; int b = 20; int& retVal=Add(a, b); Add(100, 200); return 0; }运行结果如下: 错误的原因:第一次调用Add函数时,ret的值被修改为30,被返回引用,此时ret是栈上的空间,只是因为调用函数被临时开辟出来的,所以调用完之后空间被回收,ret中存的是垃圾值。第二次调用Add函数时,又需要开辟函数运行的空间,OS就把上次的空间给了出来,ret的值被修改为300,所以retVal被改为300。
在语法概念上引用就是一个别名,没有独立空间,和其引用实体共用同一块空间。
int main() { int a = 10; int& ra = a; cout<<"&a = "<<&a<<endl; cout<<"&ra = "<<&ra<<endl; return 0; }//int a=10,b=20; //int& ra = a;相当于int* const pa = &a; //pa = &b;//错误 //const int& cra=a;相当于const int* const pa;
int main() { int a = 10; int* pa = &a; int& ra = a; return 0; }反汇编代码是相同的。
传送门:https://www.cnblogs.com/likaiming/p/9045642.html