关闭

C++中Reference与指针(Pointer)的使用对比

发表于:2014-5-16 10:40

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:ywl102402    来源:51Testing软件测试网采编

  了解引用reference与指针pointer到底有什么不同可以帮助你决定什么时候该用reference,什么时候该用pointer。
  在C++ 中,reference在很多方面与指针(pointer)具有同样的能力。虽然多数C++程序员对于何时使用reference何时使用pointer 都会有一些直觉,但总还是会有些时候搞不清楚。如果你想要建立一个关于使用reference使用的清晰有理的概念, 又有必要了解到底reference和pointer有什么不同。
  深层含义
  与pointer 类似,一个reference是一个对象(object),可以用来间接指向另一个对象。一个reference的声明与pointer的声明的实质语法结构是相同的。不同的是,声明pointer的时候使用星号操作符 * , 而声明reference的时候使用地址操作符 & 。 例如,我们有:
  int i = 3;
  则有:
  int *pi = &i;
  声明 pi 为一个指针类型的对象,并且是一个”指向int整型的指针”,它的初始值为对象i的地址。而另一方面:
  int &ri = i;
  声明 ri为一个reference类型的对象,并且也是一个指向整型的reference,它指向的是i。 我们可以看到pointer和reference的声明有显著的不同,但这并不是决定何时使用哪一个的根据。决定的真正依据是当它们被用在表达式中时其显 示的不同决定了使用哪一个合适
  Pointer 和reference的最大不同是:pointer必须使用一个星号操作符 * 来去掉reference (英文叫做dereference,我不知道这里怎样翻译这个词合适,姑且就叫“去参考”吧)而reference不需要任何操作符来去参考。 例如, 有了上面例子中的定义, 间接表达式 *pi 将 pi 去参考为指向i。相反, 表达式ri-不需要任何操作符-自动将ri去参考为指向i。因此, 使用指针p,我们需要用赋值语句:
  *p = 4;
  将i的值变为4; 而使用reference ri,我们只需要直接写:
  ri = 4;
  就可以同样将i的值变为4 。
  这个显示的不同在当你为函数的参数类型和返回值类型选择是使用pointer还是reference的时候就会显著起来,尤其是对于重载操作符的函数。
  下面使用一个针对列举类型(enumeration)的++操作符例子来说明上面这点。在C++中, 内置的++操作符对列举类型无效,例如, 对下面定义:
enum day{
Sunday, Monday, …
};
day x;
  表达式 ++x 不能编译。如果想让它通过编译,必须要定义一个名为operator++的函数,接受day为参数,并且调用 ++x 必须改变x的值。因此, 仅声明一个函数 operator++ , 以类型day为参数, 如下:
  day operator++(day d);
  并不能够得到想要得效果。 这个函数通过值传递参数(pass by value),这就意味着函数内看到的是参数的一个拷贝,而不是参数本身。为了使函数能够改变其操作数(operand)的值,它必须通过指针或reference来传递其操作数。
  通过指针传递参数(passing by pointer),函数定义如下:
  day *operator++(day *d);
  它通过将增加后的值存储到*d里面来使函数改变日期(day)的值。但是,这样你就必须使用像表达式++&x这样来调用这个操作符,这看起来不太对劲儿。
  正确的方法是定义operator++以reference为参数类型,如下:
day &operator++(day &d)
{
d = (day)(d + 1);
return d;
}
  使用这个函数, 表达式 ++x 才有正确的显示以及正确的操作。
21/212>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号