在c++中参数的传递有三种方式,他们分别是值传递,指针传递,和引用传递。 1.值传递 在函数定义括号中的参数是形参,是给函数内专用的局部变量,意味着函数接收到的是实参的副本,如果形参的值在函数内部被改变,对实参是没有影响的。
#include<iostream>
using namespace std;
class Tr
{
public:
Tr(int n)
{
i = n;
}
void set_i(int n)
{
i = n;
}
int get_i()
{
return i;
}
private:
int i;
};
void sqr_it(Tr ob)
{
ob.set_i(ob.get_i() * ob.get_i());
cout<<"在函数sqr_it内形参ob的数据成员的i的值为:"<<ob.get_i();
cout << endl;
}
int main()
{
Tr obj(10);
cout << "在调用函数sqr_it之前,实参对象obj的数据成员i的值为:";
cout << obj.get_i() << endl;
sqr_it(obj);
cout << "调用函数sqr_it之后,实参对象obj的值为:";
cout << obj.get_i() << endl;
return 0;
}
```。
传值的声明及调用
值传递的作用更多是让函数内部了解外部参数的值。值传递是单向的,只能由实参传向形参。 2指针传递 指针传递很好理解,形参为指向实参地址的指针,当对形参操作时,等同于直接通过地址操作实参。
#include <iostream>
using namespace std;
void change(int *ptr) {
*ptr = 0;
}
int main() {
int realNum = 10;
int* ptr = &realNum;
cout << "Before Change: " << realNum << endl;
change(ptr);
cout << "After Change: " << realNum ;
return 0;
}
Before Change: 10
After Change: 0
可以很明显地看见,我们在函数内部成功地修改了实参的值。是C++很常见的一种传参方式。
传指针的声明及调用
3引用传递 向函数传递参数的引用调用方法,把引用的地址复制给形式参数。在函数内,该引用用于访问调用中要用到的实际参数。这意味着,修改形式参数会影响实际参数。
指针和引用的区别 1.指针从本质上是一个变量,是一个整形变量,存放的是另一个变量的地址。指针在逻辑上是独立的,它可以被改变,甚至能改变它的值(指向其他地址),并且可以取出对应内存中的数据。 2.引用可以理解为外号,是另一个变量的同义词,它在逻辑上具有依附性,所以C++也规定引用的在创立的时候就必须被初始化(现有一个变量,然后创建对该变量的引用)。而且其引用的对象在其整个生命周期中不能被改变,即自始至终只能依附于同一个变量(初始化的时候代表的是谁的别名,就一直是谁的别名,不能变)。 3.在引用传递过程中,被调函数的形式参数虽然也作为局部变量在栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址。被调函数对形参的任何操作都被处理成间接寻址,即通过栈中存放的地址访问主调函数中的实参变量。正因为如此,被调函数对形参做的任何操作都影响了主调函数中的实参变量。
指针传递和引用传递的用处 1.函数内部修改参数并且希望改动影响调用函数。对比指针/引用传递可以将改变由形参“传给”实参(实际上就是直接在实参的内存上修改); 2.当一个函数实际需要返回多个值,而只能显式返回一个值时,可以将另外需要返回的变量以指针/引用传递。
实例:
#include<iostream>
using namespace std;
class Tr
{
public:
Tr(int n)
{
i = n;
}
void set_i(int n)
{
i = n;
}
int get_i()
{
return i;
}
private:
int i;
};
void sqr_it(Tr &ob)
{
ob.set_i(ob.get_i() * ob.get_i());
cout << "在函数sqr_it内,形式参数ob的数据成员变量i的值为:" << ob.get_i();
cout << endl;
}
int main()
{
Tr obj(10);
cout << "在调用函数sqr_it之前,实参对象obj的数据成员i的值为:";
cout << obj.get_i() << endl;
sqr_it(obj);
cout << "调用函数sqr_it之后,实参对象obj的值为:";
cout << obj.get_i() << endl;
return 0;
}
可以看见,引用传递成功地改变了参数的值,同时形参的地址和实参的地址其实是一模一样的。 引用的声明及调用
最后用一张图片总结一下
|