博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【C++基础学习】C++引用参数与指针参数
阅读量:6904 次
发布时间:2019-06-27

本文共 1383 字,大约阅读时间需要 4 分钟。

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

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

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

class X; void manip(X *px){ //在解引用之前确定它非0 if(px != 0) //解引用指针 }
另一方面,对于引用参数,函数不需要保证它指向一个对象。例如:

class Type{}; void operate(const Type& p1,const Type& p2); int main(){ Type obj1; //错误:引用参数的实参不能为0 Type 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 result return result; }实参按值传递,效率很低。

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

Matrix operator+(Matrix *m1,Matrix *x2){ Matrix result; //do the computation in result return 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 result return result; }它支持如下形式的Matrix对象的加法:

a + b + c;

转载于:https://www.cnblogs.com/xiajun/archive/2011/08/23/2298653.html

你可能感兴趣的文章
一个用perl写的发邮件的脚本
查看>>
透视学现象如何产生?
查看>>
redis python监控
查看>>
php趣味 - php 奥运五环
查看>>
Ext4 Disk Layout-2
查看>>
原 2017/5 JavaScript基础6--- 对象
查看>>
Python 列表、元组、字典t的常用方法
查看>>
MYSQL groupby使用方法。
查看>>
如何将ppt转换成pdf
查看>>
PowerDesigner连接MySQL数据库
查看>>
文件格式转换控件LEADTOOLS ePrint Professional
查看>>
ORACLE常见的六种RMAN恢复测试
查看>>
(Portal 开发读书笔记) Personalization
查看>>
SRCNN 实验细节
查看>>
Java多线程第二节-线程的基本使用
查看>>
界面控件Essential Studio for ASP.NET Web Forms 2017 v3发布丨附下载
查看>>
教你制作属于自己的CentOS 6.4一键自动化安装ISO镜像光盘
查看>>
线上 mysql 主库配置文档
查看>>
Java web部署目录结构和web.xml作用
查看>>
负载均衡DR(direct routing)模式
查看>>