您的位置:首页 > 编程语言 > C语言/C++

c++ 函数参数问题

2010-03-24 14:57 127 查看
自己不擅长写这样的技术文章,今天没事就写写吧,一是自己的博客不能老是这么的晾着的哇!还是谢谢什么吧!写吧,昨天看到c++的函数参数问题,所以今天我就在这里给大家讲讲c++ 中的函数参数问题吧!希望大家多多的提意见,多多给我指导!先谢谢了!

讲到c++的函数参数问题,首先说说在c++中有哪几种参数传递机制!在c++中有三种传参机制:

(一):值传递(值调用)

(二):指针参数

(三):引用参数

*******************************************************************

我分开一个一个的讲。首先,值传递,作为实际参数的表达式的值被复制到由对应的形式参数名所标识的对象中,做为形参的初始值。在函数体中对形参的访问、修改、都在这个标识对象上操作,与实际参数无关。注意这里,是与实际参数无关。在后面的指针参数和引用参数中大家在看看这方面的差别!看看这个程序:

#include <iostream>
using namespace std;

void change(int,int);

void main()
{
int i,j;
cin>>i
>>j;

cout<<"before change:"<<endl;
cout<<i<<" "<<j<<endl;
cout<<"after change:"<<endl;
change(i,j);
cout<<"i = "<<i<<" "<<"j = "<<j<<endl;
}

void change(int a,int b)
{
int temp;
temp = a;
a = b;
b = temp;
cout<<a<<" "<<b<<endl;
}

对与程序的输出,显而易见的。

在函数体内的操作,都是对形参的操作,对mai函数里的实参没有一点影响。

而且,如果有返回值,在函数执行return语句时,将创建一个匿名对象临时存放函数的返回结果!先值传递说到这里,一会还在后面还有拿出来比较它们的差别!

*******************************************************************

指针参数,说道指针参数,那就是传到函数形参的是实参的内存地址!就是实际参数把对象的地址值赋给形式参数名标识的指针变量中。是指针传递,因为传递的是指针,所以也叫地址调用。我把上面的哪个程序改一下!

#include <iostream>
using namespace std;

void change(int *,int *);

void main()
{
int i,j;
cin>>i
>>j;

cout<<"before change:"<<endl;
cout<<i<<" "<<j<<endl;
cout<<"after change:"<<endl;
change(&i,&j);
cout<<"i = "<<i<<" "<<"j = "<<j<<endl;
}

void change(int *a,int *b)
{
int temp;
temp = *a;
*a = *b;
*b = temp;
}

把代码Copy下来,在自己的机器上运行一下,刚刚开始写博客了,我不会往里插入图片了,不会插入运行结果的截图了,在这里对不起了,不好意思。

我们可以发现在change函数中没有输出语句,但是在运行后,你看看结果,在看看前面的那个程序代码。你会发现什么。在来看看下面的这个代码:看看你又会发现什么,你会很惊奇的。在开始接触和学习c++的时候,我也是很惊讶的。

#include <iostream>
using namespace std;

void change(int,int);

void main()
{
int i,j;
cin>>i
>>j;

cout<<"before change:"<<endl;
cout<<i<<" "<<j<<endl;
cout<<"after change:"<<endl;
change(i,j);
cout<<"i = "<<i<<" "<<"j = "<<j<<endl;
}

void change(int a,int b)
{
int temp;
temp = a;
a = b;
b = temp;
}

你在看看这个代码,和上面的代码的区别就是上面的代码是指针传递,下面的这个是值传递。看看运行结果,自己分析一下。

其实,形参指针可以通过获取对象地址访问实参地址所指对象。指针参数的本质也是传值参数。对于一般传值参数,实际参数向形式参数传送的是数据表达式,而指针参数对应的实际参数是地址表达式。如果这个表达式是一个实际对象的地址值,形式参数接收这个地址值后,可以间接访问这个地址所指的对象。

*******************************************************************

再来说一说,引用参数,在编写程序时,引用参数的使用时很平凡的。掌握好引用参数也尤为重要。引用参数和指针参数是一样神奇的。首先给大家晾一段代码吧:

#include <iostream>
using namespace std;

void change(int &,int &);

void main()
{
int i,j;
cin>>i
>>j;

cout<<"before change:"<<endl;
cout<<i<<" "<<j<<endl;
cout<<"after change:"<<endl;
change(i,j);
cout<<"i = "<<i<<" "<<"j = "<<j<<endl;
}

void change(int &a,int &b)
{
int temp;
temp = a;
a = b;
b = temp;
}

这个是引用的一个例子,大家运行一下,看看结果,是不是被吓着了!其实这样的结果,我们应该是想到的,要是没有想到。那就是你的c++基础差了,赶紧去补基础吧!

大家看到了运行结果,自己想想,这个是为什么呢?

其实,引用参数对应的实际参数应该是对象名。形式参数不需要开辟新的存储空间,这样是不是就比传值参数省内存空间了呢!注意了,重点来了,在执行函数体时,对形参的操作就是对实参对象的操作。直到函数执行结束,撤销引用绑定。

如果到了这里,你在想想上面的那个指针参数的例子。是不是觉得引用参数和指针参数有点像呢?有这样的好奇是对的。要是没有好奇,那就......

其实,引用参数和指针参数都不需要像传值参数那样产生实参对象的副本,并且,引用参数不像指针参数那样通过间址访问实参对象,特别适用于大对象参数的高效操作。

*******************************************************************

写了这么多了,不知道是不是把这个问题说清楚了,这是我第二次写这样的文章了,请大家多多指教了。我不甚感激。希望大家也支持我,写的不好,或者那些地方不对,那肯定是我理解错了,希望大家给我指出来,人无完人,希望大家支持我,我以后一定写出更出色的文章来,和大家分享!谢谢!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: