当前位置:C++技术网 > 资讯 > C++中函数按值传递与按引用传递小解

C++中函数按值传递与按引用传递小解

更新时间:2015-10-25 22:57:56浏览次数:1+次

今天倒血霉了,手机刷坏了,没用了,接着寝室断电,别的寝室都有电,就我们寝室没电,之前,也是,就我们寝室没网,断网了,别的寝室玩游戏玩的嗨......
诉苦到这里了,我们看今天的文章吧,这是我今天在断电电脑没电后,看书的一点心得。
我们知道,在C中有参数按值传递这个概念,我记得当初我学这个的时候,老师没讲明白,所以我一直都没搞懂,今天我就为你解惑。
在C++中,参数除了按值传递还有按引用传递。那么我现在就来讲讲两者的差别吧。
首先我们要有函数实参,形参的概念。那么,什么是实参,形参呢?当我们在程序代码中,声明一个函数时,我们在函数的参数列表中就会为他定义参数,此时的参数就是我们的形参。当我们在main函数中程序进行到函数调用时,此时的函数后括号里的参数列表就是实参。

我们看个程序:


#include "algorithm"
#include "iostream"
#include "iterator"
#include "vector"

void modify(int x)
{
	x=10;
}

int triple(int x)
{
	return 3*x;
}

void print_vector(std::vector<int> v)
{
	std::cout <<"{";
	std::copy(v.begin(),v.end(),std::ostream_iterator<int>(std::cout, ""));
	std::cout <<"}\n";
}

void add(std::vector<int> v,int a)
{
	for(std::vector<int>::iterator i(v.begin()); i!=v.end();++i)
		*i=*i+a;
}

int main()
{
	int a(42);
	modify(a);
	std::cout<<"a="<< a <<'\n';
	
	int b(triple(14));
	std::cout<<"b="<< b <<'\n';

	std::vector<int> data;
	data.push_back(10);
	data.push_back(20);
	data.push_back(30);
	data.push_back(40);

	print_vector(data);
	add(data ,42);
	print_vector(data);
}
看下运行结果:


仔细观察这些结果,你会发现函数modify实际上没有修改main()中变量a的值,且函数add没有写改向量data。如你所见,C+=按值传递实参,即他将实参值复制给形参,完成函数调用,我们可以对函数形参做任何的改变,但是当函数运行到最后时,他需要返回到调用点,此时的形参被销毁了。这是因为他的生命周期到了。你知道全局变量,局部变量的概念,同一个变量有不同的名称就是因为它的生命周期的不同。因此,函数参数按值传递其实就是对变量的生命周期的理解。

接着我们看下按引用传递。引用这个概念,我暂不叙述。如果你不知道的话,以前也没有听过这个概念,你就直接理解为参数地址。但你要知道的是,‘&’这是引用符号。好了,我们看程序:

#include "algorithm"
#include "iostream"
#include "iterator"
#include "vector"

void modify(int& x)
{
	x=10;
}

int triple(int x)
{
	return 3*x;
}

void print_vector(std::vector<int>& v)
{
	std::cout <<"{";
	std::copy(v.begin(),v.end(),std::ostream_iterator<int>(std::cout, ""));
	std::cout <<"}\n";
}

void add(std::vector<int>& v,int a)
{
	for(std::vector<int>::iterator i(v.begin()); i!=v.end();++i)
		*i=*i+a;
}

int main()
{
	int a(42);
	modify(a);
	std::cout<<"a="<< a <<'\n';
	
	int b(triple(14));
	std::cout<<"b="<< b <<'\n';

	std::vector<int> data;
	data.push_back(10);
	data.push_back(20);
	data.push_back(30);
	data.push_back(40);

	print_vector(data);
	add(data ,42);
	print_vector(data);
}
我们看下运行结果:


这次程序修改了函数modify的形参x,并更新了函数add中向量的内容。