找回密码
 注册
搜索
热搜: 回贴
  • 前程无忧官网首页 有什么好的平台可以
  • 最新的销售平台 互联网营销的平台有哪
  • 制作网页的基本流程 网页制作和网页设
  • 【帝国CMS】输出带序号的列表(数字排
  • 网站建设公司 三一,中联,极东泵车的
  • 织梦 建站 织梦网站模版后台怎么更改
  • 云服务官网 哪些网站有免费的简历模板
  • 如何建网站要什么条件 建网站要用什么
  • 吉林市移动公司电话 吉林省退休人员网
  • 设计类毕业论文 网站设计与实现毕业论
查看: 337|回复: 0

[分享]关于引用的经典说明

[复制链接]
发表于 2009-11-3 23:38:36 | 显示全部楼层 |阅读模式 IP:江苏扬州
引用reference 有时候又称为别名alias 它可以用作对象的另一个名字通过引用我们可以间接地操纵对象使用方式类似于指针但是不需要指针的语法在实际的程序中引用主要被用作函数的形式参数——通常将类对象传递给一个函数但是现在我们用独立的对象来介绍并示范引用的用法引用类型由类型标识符和一个取地址操作符来定义引用必须被初始化例如int ival = 1024;// ok: refVal 是一个指向ival 的引用int &refVal = ival;// 错误引用必须被初始化为指向一个对象int &refVal2;虽然引用也可以被用作一种指针但是像对指针那样用一个对象的地址初始化引用却是错误的然而我们可以定义一个指针引用例如int ival = 1024;// 错误refVal 是int 类型, 不是int*int &refVal = &ival;int *pi = &ival;// ok: refPtr 是一个指向指针的引用int *&ptrVal2 = pi;一旦引用已经定义它就不能再指向其他的对象这是它为什么必须要被初始化的原因例如下列的赋值不会使refVal 指向min_val 而是会使refVal 指向的对象ival 的值被设置为min_val 的值int min_val = 0;// ival 被设置为min_val 的值// refVal 并没有引用到min_val 上refVal = min_val;引用的所有操作实际上都被应用在它所指的对象身上包括取地址操作符例如refVal += 2;将refVal 指向的对象ival 加2 类似地如下语句int ii = refVal;把与 ival 相关联的值赋给 ii 而int *pi = &refVal;用ival 的地址初始化pi每个引用的定义必须以取地址操作符开始这与前面我们对指针的讨论是同样的问题例如// 定义两个int 类型的对象int ival = 1024, ival2 = 2048;// 定义一个引用和一个对象int &rval = ival, rval2 = ival2// 定义一个对象一个指针和一个引用int ival3 = 1024, *pi = &ival3, &ri = ival3;// 定义两个引用int &rval3 = ival3, &rval4 = ival2;const 引用可以用不同类型的对象初始化只要能从一种类型转换到另一种类型即可也可以是不可寻址的值如文字常量例如double dval = 3.14159;// 仅对于const 引用才是合法的const int &ir = 1024;const int &ir2 = dval;const double &dr = dval + 1.0;同样的初始化对于非const 引用是不合法的将导致编译错误原因有些微妙需要适当作些解释引用在内部存放的是一个对象的地址它是该对象的别名对于不可寻址的值如文字常量以及不同类型的对象编译器为了实现引用必须生成一个临时对象引用实际上指向该对象但用户不能访问它例如当我们写double dval = 1024;const int &ri = dval;编译器将其转换成int temp = dval;const int &ri = temp;如果我们给ri 赋一个新值则这样做不会改变dval 而是改变temp 对用户来说就好像修改动作没有生效这对于用户来说这并不总是好事情const 引用不会暴露这个问题因为它们是只读的不允许非const 引用指向需要临时对象的对象或值一般来说这比允许定义这样的引用但实际上不会生效的方案要好得多下面给出的例子很难在第一次就能正确声明我们希望用一个const 对象的地址来初始化一个引用非const 引用定义是非法的将导致编译时刻错误const int ival = 1024;// 错误: 要求一个const 引用int *&pi_ref = &ival;下面是我们在打算修正pi_ref 定义时首先想到的做法但是它不能生效——你能看出来这是为什么吗const int ival = 1024;// 仍然错误const int *&pi_ref = &ival;如果我们从右向左读这个定义会发现pi_ref 是一个指向定义为const 的int 型对象的指针我们的引用不是指向一个常量而是指向一个非常量指针指针指向一个const 对象正确的定义如下const int ival = 1024;// ok: 这是可以被编译器接受的const int *const &pi_ref = &ival;指针和引用有两个主要区别引用必须总是指向一个对象如果用一个引用给另一个引用赋值那么改变的是被引用的对象而不是引用本身让我们来看几个例子当我们这样写int *pi = 0;用0 初始化pi——即pi 当前不指向任何对象但当我们写如下语句时const int &ri = 0;在内部发生了以下转换int temp = 0;const int &ri = temp;引用之间的赋值是第二个不同当给定了以下代码后int ival = 1024, ival2 = 2048;int *pi = &ival, *pi2 = &ival2;我们再写如下语句pi = pi2;pi 指向的对象ival 并没有被改变实际上pi 被赋值为指向pi2 所指的对象——在本例中即ival2 重要的是现在pi 和pi2 都指向同一对象这是一个重要的错误源如果我们把一个类对象拷贝给另一个类对象而该类有一个或多个成员是指针我们将在第14 章详细讨论这个问题但是假定有下列代码int &ri = ival, &ri2 = ival2;当我们写出这样的赋值语句时ri = ri2;改变的是ival 而不是引用本身赋值之后两个引用仍然指向原来的对象实际的C++程序很少使用指向独立对象的引用类型引用类型主要被用作函数的形式参数例如// 在实际的例子中引用是如何被使用的// 返回访问状态将值放入参数bool get_next_value( int &next_value );// 重载加法操作符Matrix operator+( const Matrix&, const Matrix& );这些引用的用法和我们讨论的指向独立对象的引用类型有什么联系呢在下面这样的调用中int ival;while ( get_next_value( ival )) ...实际参数本例中为ival 同形式参数next_value 的绑定等价于下面的独立对象定义int &next_value = ival;
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|小黑屋|最新主题|手机版|微赢网络技术论坛 ( 苏ICP备08020429号 )

GMT+8, 2024-9-30 19:29 , Processed in 0.326095 second(s), 13 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表