设为首页 加入收藏

TOP

建议26:用引用代替指针(2)
2013-10-07 14:48:29 来源: 作者: 【 】 浏览:80
Tags:建议 引用 代替 指针

建议26:用引用代替指针(2)

上述代码要实现的功能极为简单,就是交换两个数据的值。SwapData1()是不能实现所设定的功能的,主要原因是函数内交换的只是实参的副本;而SwapData2()和SwapData3()则正确地实现了作者意图,其汇编代码如下:

  1.      SwapData1(a,b);  
  2. 00F431EC  mov         eax,dword ptr [b]  
  3. 00F431EF  push        eax  
  4. 00F431F0  mov         ecx,dword ptr [a]  
  5. 00F431F3  push        ecx  
  6. 00F431F4  call        SwapData1 (0F4114Fh)  
  7. 00F431F9  add         esp,8  
  8.      SwapData2(&a,&b);  
  9. 00F431FC  lea         eax,[b]  
  10. 00F431FF  push        eax  
  11. 00F43200  lea         ecx,[a]  
  12. 00F43203  push        ecx  
  13. 00F43204  call        SwapData2 (0F411EFh)  
  14. 00F43209  add         esp,8  
  15.      SwapData3(a,b);  
  16. 00F4320C  lea         eax,[b]  
  17. 00F4320F  push        eax  
  18. 00F43210  lea         ecx,[a]  
  19. 00F43213  push        ecx  
  20. 00F43214  call        SwapData3 (0F4101Eh)  
  21. 00F43219  add         esp,8 

正如汇编代码中所示的那样,SwapData2()和SwapData3()其实是一样的,都是对源数据进行操作。但是相较于SwapData2()而言,SwapData3()的实现代码更加简洁清晰。这就是引用在传递函数参数时所具有的巨大优势。

再来看函数返回值方面,如果其返回值是引用类型,那么就意味着可以对该函数的返回值重新赋值。就像下面代码所示的数组索引函数一样:

  1. template <typename T, int n> 
  2. class Array  
  3. {  
  4.    public:  
  5.        T &operator [](int i)  
  6.          {  
  7.            return a_[i];  
  8.        }  
  9.        // ...  
  10.    private:  
  11.        T a_[n];  
  12. };  
  13.  
  14. Array<int, 10> iArray;  
  15. for(int i=0; i<10; i++)  
  16.          iArray[i] = i*2; 

当然,上述代码可以使用指针重新实现,并且可以保证实现相同的功能,但是相比指针实现版,引用返回值使对数组索引函数的操作在语法上颇为自然,更容易让人接受。

也许有人认为,指针功能更强大,因为还有指向数组的指针、指向函数的指针,这里我要说的是,引用同样可以。引用在指向数组时还能够保留数组的大小信息,关于这方面的内容,在此就不多讲了。

请记住:

从编码实践角度来看,指针和引用并无太多不同。在大多情况下,指针可由索引类型完美代替,并且其实现代码更简洁清晰,更加易于理解。

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇第3章 说一说“内存管理”的那点.. 下一篇建议26:用引用代替指针(1)

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: