函数 参数传递 c++

函数调用会导致两件事情发生:

如果函数已经被声明为inline 内联则函数体可能已经在编译期间它的调用点上就被展开如果没有被声明为inline 则函数在运行时才被调用函数调用会使程序控制权被传送给正在被调用的函数而当前活动函数的执行被挂起当被调用的函数完成时主调函数在调用语句之后的语句上恢复执行函数在执行完函数体的最后一条语句或遇到返回语句return statement 后完成。

所有的函数都使用在程序运行栈run-time stack 中分配的存储区该存储区一直保持
与该函数相关联直到函数结束为止那时存储区将自动释放以便重新使用该函数的整
个存储区被称为活动记录activation record。

  1. C++中参数传递的缺省初始化方法是把实参的值拷贝到参数的存储区中这被称为按值
    传递pass-by-value。

    按值传递时函数不会访问当前调用的实参函数处理的值是它本地的拷贝这些拷贝
    被存储在运行栈中因此改变这些值不会影响实参的值

  2. 但是按值传递并不是在所有的情况下都适合不适合的情况包括
  • 当大型的类对象必须作为参数传递时对实际的应用程序而言分配对象并拷贝到

栈中的时间和空间开销往往过大

  • 当实参的值必须被修改时例如在函数swap()中用户想改变实参的值但是在

按值传递的情况下无法做到

#include <iostream>
using namespace std;
void swap (int,int);
int main() {

int i=10,j=20;
cout<<"Before swap "<<i<<' '<<j<<endl;
swap( i, j );
cout<<"After swap "<<i<<' '<<j<<endl;

}
void swap(int v1, int v2)
{
int temp = v2;
v2 = v1;
v1 = temp;
};

输出:

Before swap 10 20
After swap 10 20      //swap()交换实参的本地拷贝代表swap()实参的变量并没有被改变

解决办法:

1. 参数被声明成指针

 

#include <iostream>
using namespace std;
void swap (int*,int*);   //函数声明也要改变
int main() {
    
    int i=10,j=20;
    cout<<"Before swap "<<i<<' '<<j<<endl;
    swap( &i, &j ); cout<<"After swap "<<i<<' '<<j<<endl; } void swap(int *v1, int *v2) { int temp = *v2; *v2 = *v1; *v1 = temp; };
输出:

Before swap 10 20
After swap 20 10

2.第二种方法是把参数声明成引用

// rswap() 交换v1 和v2 引用的值
void rswap( int &v1, int &v2 ) {
int tmp = v2;
v2 = v1;
v1 = tmp;
}

main()中rswap()的调用看起来像原来的swap()调用
rswap( i, j );

#include <iostream>
using namespace std;
void swap (int &,int &);     //函数声明也要相应改变!
int main() {

int i=10,j=20;
cout<<"Before swap "<<i<<' '<<j<<endl;
swap( i, j );
cout<<"After swap "<<i<<' '<<j<<endl;

}
void swap(int &v1, int &v2)
{
int temp = v2;
v2 = v1;
v1 = temp;
};

输出:

Before swap 10 20
After swap 20 10

猜你喜欢

转载自www.cnblogs.com/zb-ml/p/8904116.html