基础备忘:C++引用参数与指针参数

举报
ShaderJoy 发表于 2021/12/30 00:02:26 2021/12/30
【摘要】 引用和指针参数,这两种参数都允许函数修改实参,也都允许有效地向函数传递大型类对象。那么,怎么样决定把函数参数声明成引用还是指针呢? 引用必须被初始化为指向一个对象,而且一旦初始化了,就不能指向其他对象。而指针可以指向一系列不同的对象也可以什么都不指向。 因为指针可能指向一个对象或者没有任何对象,所以函数在确定指针实际指向一个有...

引用和指针参数,这两种参数都允许函数修改实参,也都允许有效地向函数传递大型类对象。那么,怎么样决定把函数参数声明成引用还是指针呢?

引用必须被初始化为指向一个对象,而且一旦初始化了,就不能指向其他对象。而指针可以指向一系列不同的对象也可以什么都不指向。

因为指针可能指向一个对象或者没有任何对象,所以函数在确定指针实际指向一个有效地对象之前不能安全地解引用一个指针。例如:

[cpp]  view plain  copy
 print ?
  1. class X;  
  2. void manip(X *px){  
  3.     //在解引用之前确定它非0  
  4.     if(px != 0)  
  5.         //解引用指针  
  6. }  
另一方面,对于引用参数,函数不需要保证它指向一个对象。 例如:

[cpp]  view plain  copy
 print ?
  1. class Type{};  
  2. void operate(const Type& p1,const Type& p2);  
  3. int main(){  
  4.     Type obj1;  
  5.     //错误:引用参数的实参不能为0  
  6.     Type obj2 = operate(obj1,0);  
  7. }  
如果一个参数可能在函数中指向不同的对象,或者这个参数可能不指向任何对象,则必须使用指针参数。

引用参数的一个重要用法是,它允许我们在有效实现重载操作符的同事,还能保证用法的直观性。

看个实例,它使用了Matrix类类型。我们想支持两个Matrix对象的加法和赋值操作符,使他们的用法同内置类型一样“自然”:

[cpp]  view plain  copy
 print ?
  1. Matrix a,b,c;  
  2. c = a + b;  
Matrix类对象的加法和赋值操作符用重载操作符来实现。

为重载操作符提供一个定义:

[cpp]  view plain  copy
 print ?
  1. Matrix operator+(Matrix m1,Matrix x2){  
  2.     Matrix result;  
  3.     //do the computation in result  
  4.     return result;  
  5. }  
实参按值传递,效率很低。

为提高效率,假设我们将参数声明为指针。operator+()新的实现代码:

[cpp]  view plain  copy
 print ?
  1. Matrix operator+(Matrix *m1,Matrix *x2){  
  2.     Matrix result;  
  3.     //do the computation in result  
  4.     return result;  
  5. }  
这样有一个缺点:失去了加法操作符用法的直观性。 现在指针参数要求我们传递地址作为实参,指向Matrix对象。现在,我们的加法操作必须如下编程:

[cpp]  view plain  copy
 print ?
  1. &a + &b;  
但是这样比较难看,接口不友好。而且,在一个复合表达式中加三个对象变得很困难:

[cpp]  view plain  copy
 print ?
  1. //这无法工作  
  2. //&a+&b的返回类型是Matrix对象  
  3. &a + &b + &c;  
程序必须这样写:

[cpp]  view plain  copy
 print ?
  1. &(&a + &b) + &c;  

但是,引用参数提供了我们需要的方案。此时函数接收到的是实参的左值而不是值得拷贝。引用参数的实参是Matrix对象本身,这允许我们像对内置数据类型的对象一样自然地使用加法操作符。

operator+()实现代码:

[cpp]  view plain  copy
 print ?
  1. Matrix operator+(Matrix &m1,Matrix &x2){  
  2.     Matrix result;  
  3.     //do the computation in result  
  4.     return result;  
  5. }  
它支持如下形式的Matrix对象的加法:

[cpp]  view plain  copy
 print ?
  1. a + b + c;  

文章来源: panda1234lee.blog.csdn.net,作者:panda1234lee,版权归原作者所有,如需转载,请联系作者。

原文链接:panda1234lee.blog.csdn.net/article/details/52450422

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。