c++中引用形参与非引用形参对比

来源:互联网 发布:最游记淘宝端 编辑:程序博客网 时间:2024/05/19 05:34

1.非引用形参包括普通对象形参和指针对象形参
这类形参都是在调用函数时,在栈中临时分配一个局部副本,然后初始化,即复制实参传递的数据。调用函数并没有访问实参传递值本身,也因此不会修改实参传递的数值,即函数对这类形参所做的操作和改动仅仅是改变了局部副本的值,不会影响到实参传递的数据本身。
非引用形参表示对应实参的局部副本,同时也意味着都需要开销,不同的是指针形参所花的时间开销和存储开销基本是固定而且很小,而普通非指针对象的开销则需要根据对象具体大小来定。一旦函数执行结束,这些局部变量的值也就没有了。

注意对于指针形参,希望不要混淆其值所表示的意思。指针形参值是指一个用来存储地址的地址值(是实参地址的一个局部副本,并非实参地址本身),而非其存储地址所指的对象值。明白指向指针的指针就比较容易理解这点了,呵呵,这样对于要操作是一个指针实参的话,那么可以使用一个指向指针的指针形参即可。例如void func(int ** ptr),调用时使用&取指针地址即可。


2.引用形参同样包括指向普通对象引用形参和指向指针的引用形参
当你对第一情况有理解后,那么引用形参与指针形参的区别除了参考书中说明外,也可以参考http://bbs.chinaunix.net/thread-1614148-1-1.html里面对引用和指针的解释与说明讨论(主要是OwnWaterloo说的)。
感觉得比较多人认为使用引用形参不需要开销,然后就觉得使用引用形参会比指针形参更高效,实际并非如此。
在 C++ 中,使用引用形参看起来确实会更安全和更自然些(这就好比杀鸡不用牛刀);当然这是在知道什么情况该用时才这么说的,呵呵。
通常,引用可以实现的,指针也可以实现,但指针可以实现的功能,引用就不一定可以。


以上不考虑static 、inline 和 const情况,我想应该会有其他更好看法和解释吧,其实本来我是想讨论普通函数的指针形参值是实参传递的一个局部副本,是需要开销的,而且对该值所做的操作和改变是不影响实参传递值的,(这里好害怕会被人误解地址所指的内容啊);另外一个就是引用形参与指针形参的区别了,这个其实看了引用和指针的差别资料大概也了解了。主要是查了一下,好像比较少说明形参使用的情况。

 

转:http://bbs.chinaunix.net/thread-3562774-1-1.html
原创粉丝点击