c++参数传递的三种方式

    在《数据结构与算法分析 C++描述》第16页提到了C++中三种不同的参数传递方式,分别是:1、按常量引用调用(call by constant reference2、按值调用 3、引址调用(call by reference)。上网查了下资料之后我还是觉得分成这样三种更便于理解:

1、按值调用: 形如 int fun(int x)

2、指针调用:形如 int fun(int* p)

3、引址调用:形如 int fun(int &x) 或者 int fun(const int &x)

   按值调用存在实参的复制开销,要是有返回值又要复制一次。所以对于比较复杂的类类型实参,按值调用的复制开销是很大的。由于函数fun会对实参x复制之后再进行处理,所以按值调用的函数不管怎么处理都不会改变实参的值。

#include 
using namespace std;
int fun(int x)
{
	x=100;
	return 0;
}
void main()
{
	int a=1;
	int b=fun(a);
	cout<<"a="<

输出结果是:a=1


    指针调用有人说指针调用是一种按值调用,也可以这样理解吧。这是因为函数的形参是指针,所以函数复制的也就是指针。fun函数对指针进行处理的时候也就直接对实参指针指向的对象进行了处理,所以按指针调用的函数会修改实参对象。

#include 
using namespace std;
int fun(int* p)
{
	*p=100;
	return 0;
}
void main()
{
	int a=1;
	int *p=&a;
	int b=fun(p);
	cout<<"a="<<*p<

输出结果:a=100


    引址调用我们知道引用是独占的,即一旦创建了引用并初始化为某特定对象,它将总是引用此对象,给引用赋值并不会使它“指向”另外的对象,只是改变了对象的值。所以没有加const修饰的引址调用函数可以改变实参的值,比如:int fun(int &x),但是在进入函数和离开函数的时候没有发生复制。如果在形参类型之前再加上const则称为按“常量引用调用”这时函数只能读取实参的值而不可以改变它,例如:int fun(const int &x)。

#include 
using namespace std;
int fun(int &x)
{
	x=100;
	return 0;
}
void main()
{
	int a=1;
	int b=fun(a);
	cout<<"a="<
输出结果:a=100

如果在fun(int &x)形参类型之前加上const,在编译时会发生如下错误:



 

你可能感兴趣的:(C++)