漫步云端

移动开发(Android、iPhone、Windows Mobile) | JAVA | C | C++ | .net | Objective C | 微软企业开发技术 | 嵌入式系统设计与开发
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

引用类型

Posted on 2010-12-10 22:35  charley_yang  阅读(533)  评论(0编辑  收藏  举报

1.

引用 reference 有时候又称为别名 (alias), 它可以用作对象的另一个名字。

引用类型由类型标识符和一个取地址操作符来定义 引用必须被初始化 例如 
int ival = 1024;


// ok: refVal 是一个指向 ival 的引用
int &refVal = ival;  


// 错误 引用必须被初始化为指向一个对象 
int &refVal2;

一旦引用已经定义, 它就不能再指向其他的对象, 这是它为什么必须要被初始化的原因 。

 

2.

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

 

3.

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引用指向需要临时对 象的对象或值 一般来说 这比 允许定义这样的引用 但实际上不会生效 的方案要好
得多