传值,引用,指针

来源:互联网 发布:淘宝怎么开店步骤视频 编辑:程序博客网 时间:2024/06/05 16:28

在C++中,如果函数的实参的类型是数据类型比较大的数据类型,这是如果使用一般传参就会有很大的不方便,这是如果能够传递一个地址或者是对原来参数的一个引用对提高性能会有很大的帮助。

         本文研究一下引用传参和指针传参的区别和联系。其实引用传参和指针传参都能够在条用函数内部对源数据进行修改,这是它们的共同点,但是它们也是有区别的。下面是一个例子:

#include <iostream>using namespace std;void SwapByPoint(int* x,int* y);      //指针传参函数的声明void SwapByReference(int &x,int &y);   //引用传参函数的声明int main(){         int x = 3;         int y = 5;         cout<<"转化前: x="<<x<<" y="<<y<<"/n";    SwapByPoint(&x,&y);    //如果这里使用 SwapByPoint(x,y) 则报错:cannot convert parameter 1 from 'int' to 'int *'         cout<<"指针传参转换后:x="<<x<<" y="<<y<<"/n";         SwapByReference(x,y); //如果这里用SwapByReference(&x,&y) 则报错 cannot convert parameter 1 from 'int *' to 'int &'         cout<<"引用传参调用转换后:x="<<x<<" y="<<y<<"/n";         system("pause");         return 0;}/*交换函数 使用指针传参*/void SwapByPoint(int *x,int *y){         int temp = *x;         *x = *y;         *y = temp;}/*使用引用传参*/void SwapByReference(int &x,int &y){int temp = x;x = y;y = temp;}


指针传参和引用传参的效果是一样的。

它们的差别个人认为:

Ø 指针传参传递的是一参数(这里是Int实参)的地址,这样,虽然实参和形参不一样,但是它们只想的地址是一样的,所以对相同地址的数的操作会影响到原来的数。

Ø 引用传参传递的是一个参数本身,但是在调用函数中,把保存它们的地址的值做了交换。

两种传参方式的调用必须是上述这样的,否则会报错,在相应的代码中有提示…..


1.尽可能地不要去为某个类classA写operator classB()转型函数;

2.尽可能地不要去为某个类classA写classA(classB& b)构造函数;

3.尽可能地使用引用作为参数类型。但不包括返回值,如果某个函数的返回值不得不为引用,那么需要确保用最快的速度使用它,而且最好只是个人的内部实现,如果是在多线程机制中,那么最好函数都是void型,当然语言内置类型不应在此列,它们的最具效率的做法应该是直接传值。

 

4.指针。出于对指针的偏爱。常常容易在大量的地方使用指针,包括指针的指针,甚至指针的引用。并不是说这样有什么不好。但是出于对一位偏移问题的恐惧(是啊,任再有经验的程序员,也有可能犯下这个低级的错误,该死的01世界),以及对象多处引用的需要(灵巧指针并不总是那么好用,犹其在数组中),再加上引用计数实现得并不是那么优美,再配上几个并不是特别注意此问题的同事。一个后期野指针到处飞的程序,可以让任何半路接手维护的程序员茶饭不思,并深深地感觉到程序员工作的体力性。

 

5.尽量减少自定义类类型的临时对象的构造与析构过程。相比于效率代价,它带来的便利实在不应该是让我们选择这么做的原因。



原创粉丝点击