cpp*_*der 42 c++ pointers reference parameter-passing
在这两种情况下,我都取得了成果.那么什么时候优先于另一个呢?我们使用其中一个的原因是什么?
#include <iostream>
using namespace std;
void swap(int* x, int* y)
{
int z = *x;
*x=*y;
*y=z;
}
void swap(int& x, int& y)
{
int z = x;
x=y;
y=z;
}
int main()
{
int a = 45;
int b = 35;
cout<<"Before Swap\n";
cout<<"a="<<a<<" b="<<b<<"\n";
swap(&a,&b);
cout<<"After Swap with pass by pointer\n";
cout<<"a="<<a<<" b="<<b<<"\n";
swap(a,b);
cout<<"After Swap with pass by reference\n";
cout<<"a="<<a<<" b="<<b<<"\n";
}
Run Code Online (Sandbox Code Playgroud)
产量
Before Swap
a=45 b=35
After Swap with pass by pointer
a=35 b=45
After Swap with pass by reference
a=45 b=35
Run Code Online (Sandbox Code Playgroud)
mos*_*ear 27
引用在语义上如下:
T& <=> *(T * const)
const T& <=> *(T const * const)
T&& <=> [no C equivalent]
(C++ 11)
与其他答案一样,C++ FAQ中的以下内容是单行答案:尽可能引用,需要时指针.
指针的一个优点是你需要显式转换才能传递NULL.不过,它仍然有可能.在我测试的编译器中,没有一个发出以下警告:
int* p() {
return 0;
}
void x(int& y) {
y = 1;
}
int main() {
x(*p());
}
Run Code Online (Sandbox Code Playgroud)
小智 6
事实上,大多数编译器为两个函数调用发出相同的代码,因为引用通常使用指针实现.
遵循这个逻辑,当在函数体中使用(非const)引用类型的参数时,生成的代码将默默地对参数的地址进行操作,并且它将取消引用它.此外,当遇到对此类函数的调用时,编译器将生成传递参数地址而不是复制其值的代码.
基本上,引用和指针与实现的观点并没有太大差别,主要(也是非常重要的)区别在于哲学:引用是对象本身,只是名称不同.
与指针相比,引用具有更多优点(例如它们不能NULL
,因此它们使用起来更安全).因此,如果您可以使用C++,那么通过引用传递通常被认为更优雅,它应该是首选.但是,在C中,没有通过引用传递,所以如果你想编写C代码(或者,可怕的dictu,编译同时使用C和C++编译器的代码,尽管这不是一个好主意),你将不得不限制自己使用指针.
归档时间: |
|
查看次数: |
99214 次 |
最近记录: |