说一下传值调用的定义:传值调用是指在调用参数的时候,不是对原函数进行操作,而是创建参数的拷贝并对其进行操作,这种调用有利于保护数据。(百度上找的,其实我也不太懂)
我觉得传值调用就一个作用,在对实参进行函数的加工时,改变形参所对应实参的值,,,没了。。。
接下来这个代码就很好的解释了这个定义。
#include<bits/stdc++.h>
using namespace std;
void Change(int t1,int t2)
{
int temp;
temp=t1;
t1=t2;
t2=temp;
}
int main()
{
int a=1,b=2;
cout<<"a原来的值 "<<a<<"b原来的值 "<<b<<endl;
Change(a,b);
cout<<"a加工后的值 "<<a<<"b加工后的值 "<<b<<endl;
return 0;
}
运行结果:
a原来的值 1 b原来的值 2
a加工后的值1 b加工后的值 2
运行结果:
1 2 //1 2.(虽然函数表面上进行了交换,但是其实还是没有交换的)
再看接下来这个代码:
#include<bits/stdc++.h>
using namespace std;
void Change(int &t1,int &t2)
{
int temp;
temp=t1;
t1=t2;
t2=temp;
}
int main()
{
int a=1,b=2;
cout<"a原来的值 "<<a<<"b原来的值 "<<b<<endl;
Change(a,b);
cout<<"a原来的值"<<a<<"b原来的值 "<<b<<endl;
return 0;
}
运行结果:
a原来的值 1 b原来的值 2
a加工后的值2 b加工后的值 1
//不同的地方只是在函数的形参加上了“&”这个符号。
再拓展一下,我们可以看在函数加工的过程中temp的变化情况,代码如下。
#include<bits/stdc++.h>
using namespace std;
int temp=45454;
void Change(int &t1,int &t2)
{
temp=t1;
t1=t2;
t2=temp;
}
int main()
{
int a=1,b=2;
cout<<"a原来的值 "<<a<<"b原来的值 "<<b<<endl;
cout<<"未加工前temp的值 "<<temp<<endl;
Change(a,b);
cout<<"加工后temp的值"<<temp<<endl;
cout<<"加工后a的值"<<a<<" 加工后b的值 "<<b<<endl;
return 0;
}
运行结果:
a原来的值 1 b原来的值 2
未加工前temp的值 45454
加工后temp的值 1
a加工后的值2 b加工后的值 1
这个地方temp的值确确实实的变了(今晚的新收获)
(可能这些你都会。。。但我只是想说的比较明白一点。。原谅我这么啰嗦了)
然后说一下课本上第276页的例题,为什么有的使用了引用调用,有的没有使用引用的调用?如果加了引用调用的话,结果就是一番操作之后形参确确实实的变了,同时在函数中参与加工的变量也变了。
这里我就截取例题的一部分打了。
Complex Complex::operator + (Complex &c)
{
Complex temp;
temp.real = real + c.real;
temp.imag = imag+c.imag;
return temp;
}
Complex Complex::operator + (double d)
{
Complex temp;
temp.real = real + d;
temp. imag = imag;
return temp;
}
Complex Complex::operator = (Complex c)
{
real = c.real;
imag = c.imag;
return *this;
}
观察一下,只有复数与复数相加的时候加了取地址符号,剩下的两个都没加,第一加取地址的符号当然是为了改变c3的实部和虚部,第二个不用加因为在进行第二个函数加工时只是复数的实部发生变化就足够了。第三个也同样类似,并不需要对实数整体的再改变,就想前面的例题中对与temp的观察,无论是地址调用还是非地址调用,函数体中除了形参的其他变量外一定会发生变化,所以没有必要加取地址符号。
哈哈哈哈哈哈,终于打完了,我顺便也接着这个机会学会了好多东西。