摘要:简要比较了直接、指针、引用三中函数参数传递方式,并对其优缺点进行了大致的说明
1. 众所周知,函数参数的直接传递就是实现一个拷贝值,这个拷贝值的变化,并不会改变原值的变化,因为两个被来就是不同的个体,就好比两个克隆的个体,虽然两者之间有很多相同的地方,但是它们的思维是独立的。
2. 通过指针的方式给函数参数传值呢,从根本上来讲,它仍然是直接传值,但是这个拷贝的值比较特殊,是一个地址罢了,如:
1: void fun(int *pnValue)
2: {
3: ...;
4: }
5: int main()
6: {
7: int nValue = 6;
8: fun(&nValue);
9: }
它其实是将nValue的地址拷贝给了pnValue,如果在fun函数中,一开始就将pnValue的值给改变,如pnValue=&nValue2,那么pnValue指向的内容的改变,将不会影响到nValue。
同时有一点需要注意的是,空指针对象是没有意义的,会引起程序的奔溃,因此在开始因该进行检测,if(!pnValue) return;
通过指针传参数的优点:
1) 允许你改变传递的参数的值
2) 由于它拷贝的仅仅是一个字节大小的地址,因此传递的过程是快速的,特别对于较大的结构或是类
3) 我们通过这种传参方式,获取从函数中返回的多个量
缺点:
1) 传递的只能是普通的变量,不能是字面常量或表达式
2) 所有的传递值都得检查是不是空指针
3. 通过引用的方式传递参数
虽然在底层的操作中,通过引用也是通过“指针的方式”进行实现的http://blog.csdn.net/wanwenweifly4/article/details/6739687),但是从语言上考虑,引用是对象的别名,也是一个对象,并不是指针,因为它的概念是在语言上定义的,而不是底层的实现方式,换一种思维,抛开所有的比汇编语言高级的语言,回到汇编语言建立初期,单单从汇编语言上考虑,那时有没有指针的概念呢?因此应该理性的对待引用在C++语言中的概念,也应该冷静的认识它在底层中的实现方式,区分的对待,其实也不用争执于这个问题,认清了,会用了,就成了。(这些仅个人见解,批判的看待吧)。
它在传参中的优点:
1) 允许你改变传递的参数的值
2) 传递的过程是快速的,特别对于较大的结构或是类
3) 可以通过添加一个const,避免不经意的改变
4) 我们通过这种传参方式,获取从函数中返回的多个量
缺点:
1) 非const类型的参数,传递的只能是普通的变量,不能是字面常量或表达式
2) 不容易区分哪些变量是input,需要output,或都是
3) 通过函数的调用,很难看出那个参数是将被改变的,因为它和直接传值的方式相同,只能通过函数原型进行辨认,当程序员不小心忽视的时候,可能会导致错误的发生
ps:
1: #include <iostream>
2:
3: int nFive = 5;
4: int nSix = 6;
8: void SetToSix(int *pTempPtr);
9:
10: int main()
11: {
12: using namespace std;
13:
16: int *pPtr = &nFive;
19: cout << *pPtr;
20:
23: SetToSix(pPtr);
27: cout << *pPtr;
28:
29: return 0;
30: }
31:
33: void SetToSix(int *pTempPtr)
34: {
35: using namespace std;
36:
38: pTempPtr = &nSix;
41: cout << *pTempPtr;
42: }
上面这个程序中输出的结果是 565
如果想使得输出的结果为566呢,有一个方法可以实现,就是采用指针的引用,如下:
1: // pTempPtr is now a reference to a pointer to pPtr!
2: // This means if we change pTempPtr, we change pPtr!
3: void SetToSix(int *&pTempPtr)
4: {
5: using namespace std;
6:
7: pTempPtr = &nSix;
8:
9: // This will print 6
10: cout << *pTempPtr;
11: }