Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4562585
  • 博文数量: 385
  • 博客积分: 21208
  • 博客等级: 上将
  • 技术积分: 4393
  • 用 户 组: 普通用户
  • 注册时间: 2006-09-30 13:40
文章分类

全部博文(385)

文章存档

2015年(1)

2014年(3)

2012年(16)

2011年(42)

2010年(1)

2009年(2)

2008年(34)

2007年(188)

2006年(110)

分类: LINUX

2008-08-31 22:38:24




引用, 在具体实现时, 会申请一个临时空间, 目的是存放被引用对象的地址. 当使用引用变量时, 其实就是对被引用对象作了一次间接寻址.



int main()
...{
    int a = 100;
    int &b = a;
    int *c = &a;
    b = 99;
    a = 88;
    b = 77;
    *c = 66;

    return 0;
}



引用, 在具体实现时, 会申请一个临时空间(栈内空间), 目的是存放被引用对象的地址. 当使用引用变量时, 其实就是对被引用对象作了一次间接寻址. 而从汇编代码中来看, *c 确实与 b 在使用时的汇编代码一样, 都是先取地址, 再将值存入此地址. 所不同的, 只是在c++层面, 作为如 b 这样的引用类型变量, 只可在初始化时赋值, 且只能赋值一次.

例如operator=,  
  如果你不想(a=b)=c,你可以返回const   T&
 
   函数返回值采用“引用传递”的场合并不多,这种方式一般只出现在类的赋值函数
中,目的是为了实现链式表达。
例如
class   A
{
       A   &  operate   =   (const  A   &other);  //   赋值函数
};
       A   a,   b,  c;   //   a,  b,   c   为A  的对象
       a   =   b  =   c;   //  正常的链式赋值2001   Page  84   of  101
       (a   =   b)  =   c;   //  不正常的链式赋值,但合法
如果将赋值函数的返回值加const  修饰,那么该返回值的内容不允许被改动。上例
中,语句   a   =  b   =   c  仍然正确,但是语句   (a  =   b)   =  c   则是非法的。

认为对于函数来说上面例子就可以了解大概了,对于内部类型左值就是能够被赋值的变量。
像   const   int  a   =   0;  a就不是左值了因为不能被赋值
阅读(1537) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~