诉苦到这里了,我们看今天的文章吧,这是我今天在断电电脑没电后,看书的一点心得。
我们知道,在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中向量的内容。