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

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

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

class X;
void manip(X *px){//在解引用之前确定它非0if(px != 0)//解引用指针
}

另一方面,对于引用参数,函数不需要保证它指向一个对象。例如:

class Type{};
void operate(const Type& p1,const Type& p2);
int main(){Type obj1;//错误:引用参数的实参不能为0Type obj2 = operate(obj1,0);
}

如果一个参数可能在函数中指向不同的对象,或者这个参数可能不指向任何对象,则必须使用指针参数。

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

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

Matrix a,b,c;
c = a + b;

Matrix类对象的加法和赋值操作符用重载操作符来实现。

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

Matrix operator+(Matrix m1,Matrix x2){Matrix result;//do the computation in resultreturn result;
}

实参按值传递,效率很低。

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

Matrix operator+(Matrix *m1,Matrix *x2){Matrix result;//do the computation in resultreturn result;
}

这样有一个缺点:失去了加法操作符用法的直观性。现在指针参数要求我们传递地址作为实参,指向Matrix对象。现在,我们的加法操作必须如下编程:

&a + &b;

但是这样比较难看,接口不友好。而且,在一个复合表达式中加三个对象变得很困难:

//这无法工作
//&a+&b的返回类型是Matrix对象
&a + &b + &c;

程序必须这样写:

&(&a + &b) + &c;

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

operator+()实现代码:

Matrix operator+(Matrix &m1,Matrix &x2){Matrix result;//do the computation in resultreturn result;
}

它支持如下形式的Matrix对象的加法:

a + b + c;

【C++基础学习】C++引用参数与指针参数相关推荐

  1. C语言程序设计 | 指针(二):常量指针和指针常量、数组参数和指针参数、函数指针数组

    指针的进阶(二)目录: 常量指针和指针常量 数组参数和指针参数 函数指针数组 常量指针和指针常量 在我们日常中,经常会用到一个关键字const const是一个C语言(ANSI C)的关键字,具有着举 ...

  2. C语言笔记 第三十五课 数组参数和指针参数分析

    第三十五课 数组参数和指针参数分析 思考:为什么C语言中的数组参数会退化为指针? 退化的意义 C语言中只会以值拷贝的方式传输参数 当向函数传递数组时:(错误的,设计当初的思路) 将整个数组拷贝一份传入 ...

  3. c++基础学习(05)--(指针,引用)

    文章目录 目录 1.指针 2.引用 目录 1.指针 #include <iostream>using namespace std;int main () {int var1;char va ...

  4. C语言学习笔记--数组参数和指针参数

    1. 数组参数退化为指针的意义 (1)C 语言中只会以值拷贝的方式传递参数,当向函数传递数组时,将整个数组拷贝一份传入函数导致执行效率低下,C 语言以高效作是最初的设计目标,所以这种方法是不可取的. ...

  5. C语言数组参数与指针参数

    我们都知道参数分为形参和实参.形参是指声明或定义函数时的参数,而实参是在调用函数时主调函数传递过来的实际值. 一.一维数组参数 1.能否向函数传递一个数组?看例子: void fun(char a[1 ...

  6. Java基础学习总结(120)——JVM 参数使用详细说明

    一.什么是JVM? JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实 ...

  7. c27-数组退化(数组参数和指针参数分析)

    为什么C语言的数组参数会退化为指针? 退化的意义: 二维数组参数 等价关系 代码分析: #include <stdio.h>void access(int a[][3], int row) ...

  8. 【C 语言】指针 与 数组 ( 指针 | 数组 | 指针运算 | 数组访问方式 | 字符串 | 指针数组 | 数组指针 | 多维数组 | 多维指针 | 数组参数 | 函数指针 | 复杂指针解读)

    相关文章链接 : 1.[嵌入式开发]C语言 指针数组 多维数组 2.[嵌入式开发]C语言 命令行参数 函数指针 gdb调试 3.[嵌入式开发]C语言 结构体相关 的 函数 指针 数组 4.[嵌入式开发 ...

  9. 重新学习c++--理解引用、智能指针、虚函数、模板、容器

    最近几年用c和python比较多,上次用c++写程序已经是几年前的事情了.温故而知新,是时候重新学习下c++了. C++可以分成四大块去理解: C c++仍以C为基础,区块blocks.语句state ...

最新文章

  1. php缺失php5.dll,php5.dll丢失怎么办
  2. 做时间序列预测有必要用深度学习吗?事实证明,梯度提升回归树媲美甚至超越多个DNN模型...
  3. vim 居中光标所在行(转载)
  4. 微软官方反间谍流氓软件WindowsDefender
  5. java pdf表单域实现_Java 创建PDF表单域 - 文本框、复选框、列表框、组合框、按钮等...
  6. MsWord 操作总结
  7. 通过项目逐步深入了解Mybatis(四)
  8. leetcode 28. 实现 strStr()(kmp)
  9. 每日一题(3)—— -2与2的比较(二)
  10. Java基础11-封装(思想、访问权限、this、构造方法)
  11. 校招对项目实战要求分析
  12. Hive排名函数入门
  13. Excel比较两列的值
  14. 每个设计师都应该了解的IOS编年史
  15. arcgis中 shift数据重新定义投影_【更新85篇】地理数据科学技术文章合集,欢迎大家点赞、在看、转发三连!...
  16. css内联样式---动态绑定背景图片
  17. 如何画出一张合格的技术架构图?
  18. 一、解决Linux开启CentOS虚拟机就蓝屏问题
  19. 2018-8-10-如何写毕业论文-表格
  20. Luogu P5069 [Ynoi2015] 纵使日薄西山

热门文章

  1. 【pytorch】torch.range() 和 torch.arange() ==>以step为间隔输出从start到end的张量列表
  2. 价值199的wp移植Emlog主题模板PandaPRO
  3. 恐怖地狱火恶魔叉404模板下载
  4. 简洁的个人导航主页API网站源码 随机背景图
  5. 正式环境docker部署hyperf_使用docker搭建hyperf环境连接mysql
  6. htt【RiPro网盘链接检测插件】目前支持四种常用网盘
  7. 网抑云熬夜打卡源码+微信登录+免签支付+今日打卡统计
  8. 完整解决方案:让你的IIS 支持PHP方法
  9. 判断两个数组中是否存在相同的数字
  10. Visual Studio下的PHP开发工具VS.PHP初探