上述代码要实现的功能极为简单,就是交换两个数据的值。SwapData1()是不能实现所设定的功能的,主要原因是函数内交换的只是实参的副本;而SwapData2()和SwapData3()则正确地实现了作者意图,其汇编代码如下:
- SwapData1(a,b);
- 00F431EC mov eax,dword ptr [b]
- 00F431EF push eax
- 00F431F0 mov ecx,dword ptr [a]
- 00F431F3 push ecx
- 00F431F4 call SwapData1 (0F4114Fh)
- 00F431F9 add esp,8
- SwapData2(&a,&b);
- 00F431FC lea eax,[b]
- 00F431FF push eax
- 00F43200 lea ecx,[a]
- 00F43203 push ecx
- 00F43204 call SwapData2 (0F411EFh)
- 00F43209 add esp,8
- SwapData3(a,b);
- 00F4320C lea eax,[b]
- 00F4320F push eax
- 00F43210 lea ecx,[a]
- 00F43213 push ecx
- 00F43214 call SwapData3 (0F4101Eh)
- 00F43219 add esp,8
|
正如汇编代码中所示的那样,SwapData2()和SwapData3()其实是一样的,都是对源数据进行操作。但是相较于SwapData2()而言,SwapData3()的实现代码更加简洁清晰。这就是引用在传递函数参数时所具有的巨大优势。
再来看函数返回值方面,如果其返回值是引用类型,那么就意味着可以对该函数的返回值重新赋值。就像下面代码所示的数组索引函数一样:
- template <typename T, int n>
- class Array
- {
- public:
- T &operator [](int i)
- {
- return a_[i];
- }
- // ...
- private:
- T a_[n];
- };
-
- Array<int, 10> iArray;
- for(int i=0; i<10; i++)
- iArray[i] = i*2;
|
当然,上述代码可以使用指针重新实现,并且可以保证实现相同的功能,但是相比指针实现版,引用返回值使对数组索引函数的操作在语法上颇为自然,更容易让人接受。
也许有人认为,指针功能更强大,因为还有指向数组的指针、指向函数的指针,这里我要说的是,引用同样可以。引用在指向数组时还能够保留数组的大小信息,关于这方面的内容,在此就不多讲了。
请记住:
从编码实践角度来看,指针和引用并无太多不同。在大多情况下,指针可由索引类型完美代替,并且其实现代码更简洁清晰,更加易于理解。
相关链接:
编写高质量代码:改善C++程序的150个建议(连载1)
编写高质量代码:改善C++程序的150个建议(连载2)
编写高质量代码:改善C++程序的150个建议(连载3)
编写高质量代码:改善C++程序的150个建议(连载4)
编写高质量代码:改善C++程序的150个建议(连载5)
编写高质量代码:改善C++程序的150个建议(连载6)
编写高质量代码:改善C++程序的150个建议(连载7)
编写高质量代码:改善C++程序的150个建议(连载8)
编写高质量代码:改善C++程序的150个建议(连载9)
编写高质量代码:改善C++程序的150个建议(连载10)
编写高质量代码:改善C++程序的150个建议(连载11)
编写高质量代码:改善C++程序的150个建议(连载12)