Referances 和 pointer的区别

 

1.     References不能为null,而pointer却可以

string  &s1               //错误。Referencesbi必须被初始化

char* p 0x0;         //正确,指针可以为空

2.     References必须有初值,pointer却不受限制

string  s1(“hello”)      //ok!

String  &s2 = s1    // ok!,s2指向s1

String* ps                  //正确。

由于References必须有初值,这就意味着使用References可能更有效率,因为使用References之前不需要进行有效性测试。比如

      void    Func(const int& rd)

{         Cout << rd;    }

 

      void    Func(const int* rd)

{    If(rd)         Cout << rd;    }

3.     pointer可以被重新赋值,reference却总是指向他最初获取的值。

String s1(“张三”);

String s2(“李四”);

String & rs = s1;

Rs = s2;   //注意!!!此时的地址不变化,但是内容却发生了变化,s1已经和s2相同。可见rs一旦已reference方式初始焕,其指向的地址就一直不变,

           String * ps = s2;

* ps = s1;  //无论ps指向谁,其第一指向的值都不受到影响,改变的只是ps指向的地址的值。

因此,可以这么理解:以reference初始化后,其地址恒久不变,每一次的赋值改变都是地址内的数据改变;以pointer初始化后,其数值不变,每一次改变只是改变指向的地址的值。

4.     互相之间可相互转换;

int array[10];

… … …

int& GetItem(int dIndex)

{     Return  array[dIndex]; }

int *GetItem(int dIndex)

{    Return  *array[dIndex]; }

注意:针对此处的返回结果,如果在外部进行修改,若对以reference方式获取的数据进行修改,则对原数据(array[dIndex])不受影响,因为返回的值是一个临时构造生成的新的变量。而以pointer方式获取的数据进行修改,原数据(array[dIndex])相应的被修改,应为被修改的值就是原数据array[dIndex]

 

注,本文内容可请参考 scott meyers 的 more effective c++

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值