动态网站制作指南 [  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
电脑书籍下载:程序设计书籍 | 数据库教程书籍 | 平面与多媒体书籍 | 网络通讯书籍 | 系统管理书籍 | 网络安全书籍 | 认证考试书籍
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > C/C++教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ C/C++教程 ]的信息



本月文章推荐
.自解密的加密程序的制作.
.对马踏棋盘的一点研究.
.用C++实现跨平台游戏开发之Alleg.
.改变打开对话框中"打开&quo.
.C++中的const限定修饰符.
.C++中对浮点数的格式化显示.
.绝对经典 C++初学者必看的50个建.
.API之文本和字体函数.
.自定义控件(支持模板).
.小商品软件的加密方法.
.高质量C++/C编程指南 --&nb.
.2004年计算机等级考试二级C语言试.
.C语言初学者入门讲座 第十讲 函数.
.Creating Reusable Software Lib.
.在Windows NT 下实现对I/O地址的.
.Eratosthenes筛法求素数.
.C++数据结构学习:递归(3).
..
.一个画抛物线的程序.
.常用的BCB & Delphi&n.

C++中的引用(reference)

发表日期:2008-3-8 |


C++中的引用(reference)
1.简介     引用是C++引入的新语言特性。从语意上来说,引用就是一个变量的别名,就好象古代人的“字”和“号”,东坡居士和苏轼只是一个人的不同称呼。对引用的操作对变量产生的影响与对变量直接操作完全一样。例如: int i = 0;
int & iRef = i;

iRef++;  // i = iRef = 1     尽管引用不使用指针的操作符(*, ->)但是,它看上去跟指针好象并没有区别,而且就上面的例子而言,这个引用所产生的作用完全可以由指针完成。那么为什么C++中还要增加这样一个特性呢?引用显然应该具备指针不能完成的功能,否则它就失去了价值。这方面的探讨我们留到第3节。2.引用的语法 在这里我们只讨论一些语法相关的问题。 ·引用必须在定义的同时初始化 int i;
int & j;  // 错误,没有初始化。
int & k=i; // 正确     这个例子有个很好的比喻,小时候小朋友间会互相起“外号”,这些外号在产生的时候总是有所指的,即针对一个具体的小朋友的。引用也一样,定义的时候,必须指明它是谁的别名。 ·外部(extern)引用定义不必给出初值 extern int & i; // 正确,不必给出初值 ·引用初始化后不能再使其成为其它变量的引用 int j, k;
int & i = j;
i = k;    // 错误,不能更改!     引用类似一个常量指针(int * const p),不能修改引用的指向。 ·引用的地址     假设有如下定义: int j;
int & i = j;     那么,&i应该是什么呢?是一个“引用的地址”么?答案是:no。&i = &j,就是j这个变量的地址。3.引用使用技巧

3.1 引用和多态

    引用是除指针外另一个可以产生多态效果的手段。这意味着,一个基类的引用可以指向它的派生类实例。例如: class A;
class B: public A
{
   ...
};

B b;
A & aRef = b;    // 基类引用指向派生类     假如A类中定义有虚函数,并且在B类中重写了这个虚函数,就可以通过aRef产生多态效果。

3.2 作为参数

    引用的一个重要作用就是作为函数的参数类型。C/C++的函数参数是传值的,假如有大对象(例如一个大的结构)需要作为参数传递的时候,以前的(C语言中)方案往往是指针,因为这样可以避免将整个对象全部压栈,可以提高程序的效率。但是现在(C++中)又增加了一种同样有效率的选择,就是引用。     与指针类型的参数一样,引用不论指向什么类型的对象,作为参数传递的时候都是只压栈4个字节(在32位机上)。引用所占用的4字节大小是根据编译器产生的代码判定的,因为sizeof(a_reference)只能得到它所指向对象的大小。     引用型参数应该在能被定义为const的情况下,尽量定义为const,这不光是让代码更健壮,也有些其它方面的需要,例如,假设有如下函数声明: string foo();
void bar(string & s);     那么下面的表达式将是非法的: bar(foo());
bar("hello world");     原因在于foo()和"hello world"串都会产生一个临时对象,而在C++中,这些临时对象都是const类型的。因此上面的表达式就是试图将一个const类型的对象转换为非const类型,这是非法的。

3.3 作为返回值

    引用作为返回值的时候,有一些规则必须遵守。这些规则包括:
  • 不能返回局部变量的引用。这条可以参照Effective C++[1]的Item 31。主要原因是局部变量会在函数返回后被销毁,因此被返回的引用就成为了“无所指”的引用,程序会进入未知状态。
  • 不能返回函数内部new分配的内存的引用。这条可以参照Effective C++[1]的Item 31。虽然不存在局部变量的被动销毁问题,可对于这种情况(返回函数内部new分配内存的引用),又面临其它尴尬局面。例如,被函数返回的引用只是作为一个临时变量出现,而没有被赋予一个实际的变量,那么这个引用所指向的空间(由new分配)就无法释放,造成memory leak。
  • 可以返回类成员的引用,但最好是const。这条原则可以参照Effective C++[1]的Item 30。主要原因是当对象的属性是与某种业务规则(business rule)相关联的时候,其赋值经常与某些其它属性或者对象的状态有关,因此有必要将赋值操作封装在一个业务规则当中。假如其它对象可以获得该属性的非常量引用(或指针),那么对该属性的单纯赋值就会破坏业务规则的完整性。
    另外,引用也经常与一些操作符的重载相关:
  • 流操作符<<和>>。这两个操作符经常希望被连续使用,例如:cout << "hello" << endl;因此这两个操作符的返回值应该是一个仍然支持这两个操作符的流引用。可选的其它方案包括:返回一个流对象和返回一个流对象指针。但是对于返回一个流对象,程序必须重新(拷贝)构造一个新的流对象,也就是说,连续的两个<<操作符实际上是针对不同对象的!这无法让人接受。对于返回一个流指针则不能连续使用<<操作符。因此,返回一个流对象引用是唯一选择。这个唯一选择很要害,它说明了引用的重要性以及无可替代性,也许这就是C++语言中引入引用这个概念的原因吧。
  • 赋值操作符=。这个操作符象流操作符一样,是可以连续使用的,例如:x = j = 10;或者(x=10)=100;赋值操作符的返回值必须是一个左值,以便可以被继续赋值。因此引用成了这个操作符的唯一返回值选择。
    在另外的一些操作符中,却千万不能返回引用:
  • +-*/四则运算符。它们不能返回引用,Effective C++[1]的Item23具体的讨论了这个问题。主要原因是这四个操作符没有side effect,因此,它们必须构造一个对象作为返回值,可选的方案包括:返回一个对象、返回一个局部变量的引用,返回一个new分配的对象的引用、返回一个静态对象引用。根据前面提到的引用作为返回值的三个规则,第2、3两个方案都被否决了。静态对象的引用又因为((a+b) == (c+d))会永远为true而导致错误。所以可选的只剩下返回一个对象了。

3.4 什么时候使用引用

    现在可以总结一下什么时候使用引用这个问题了。首先我们要看看什么时候必须使用引用:
  • 流操作符<<和>>、赋值操作符=的返回值
  • 拷贝构造函数的参数、赋值操作符=的参数
    其它下面的情况都是推荐使用引用,但是也可以不使用引用。假如不想使用引用,完全可以使用指针或者其它类似的东西替代:
  • 异常catch的参数表
  • 大对象作为参数传递
  • 返回容器类中的单个元素
  • 返回类数据成员(非内建数据类型成员)
  • 返回其它持久存在的,且获得者不负责销毁的对象
    另外一些情况下,不能返回引用:
  • +-*/四则运算符
 4.参考资料 [1] Effective C++: Scott Meyers

上一篇:C++多态技术 人气:404
下一篇:VC快捷键大全 人气:1021
浏览全部C/C++的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-7-24 Sablog-X v2.0 预览版
2008-7-24 帝国备份王EmpireBak 2008 正式版
2008-7-24 网趣网上购物系统时尚版 v8.2
2008-7-24 纵横B2B电子商务系统XYECS!B2B v
2008-7-24 e路小说小偷 v1.2.0723
2008-7-24 凌风美女图片站程序 v2.2
2008-7-24 TOM15电影收索程序
2008-7-24 清风信息自动采集生成系统 v1.0
2008-7-24 QQ邮箱编辑器 v1.0 (小小菜刀ASP
2008-7-19 UltraEdit 简体中文增强版 14.10
2008-7-19 CentOS 5.2 i386 LiveCD
2008-7-19 Snapture多功能相机 v1.4
2008-7-19 iAcces中文输入法 v1.0Build016
2008-7-19 Cookbook烹饪秘籍 v2.5
2008-7-19 苹果专用DVD转换工具 v1.1.59汉化
2008-7-19 Modem修复软件ZiPhone修改版04.0
2008-7-19 AgileMessenger即时通讯工具美化
2008-7-19 Sketches画图软件 v0.7b6破解版


  发表评论
姓 名: 验证码:
内 容:
[ 汉字翻译拼音 ] [ 广告代码 ] [ 符号对照表 ] [ 进制转换 ] [ 经典小工具 ] [ 个税计算 ] [ 汉字简繁转换 ] [ 普通单位换算 ] [ 公制单位换算 ]
[ 生辰老黄历 ] [ 国内电话区号 ] [ 国家代码与域名缩写 ] [ 文字加密解密 ] [ 健康查询 ] [ 万年历 ] [ 手机号码查询 ] [ ip搜索 ] [ Google PR查询 ]
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2008 www.knowsky.com All rights reserved | 网络实名:动态网站制作指南 | 沪ICP备05001343号
ホームページ制作 不動産検索システム 求人情報
防水工事·改修工事 フットサル大会 探偵