尽可能使用常量引用的理由

      由于本学期学校开了c++这门课程,虽然我是之前是学java的,但是迫于课程考试压力,而且c++还是挺有用的,所以我还是稍微看了一下。一开始,就对c++的引用产生兴趣,因为在java中,我从来就没有对引用有过任何想法,因为对于对象,java都是采用按引用传递的形式,而且不知道是不是因为我入门的那本《java编程思想》默认我已经是有C++或C经验,所以对于引用,基本上,只是说出个名词而已,但是在C++这里,我就能看到引用的全貌了(因为java本来就源于c++^-^)。C++里的引用,分为常量引用和非常量引用两种,两者在写法上的区别就在于前者前面多了个const修饰词,但是意义且大不相同。非常量引用是可以修改被传递的对象的值的,比如说,我们交换两个对象的值,是需要将两个对象的引用传进来,如果是按值传递,传进来的只是对象的拷贝,原来的对象并没有被交换,而常量引用是不允许修改参数的。但是这种行为真的好吗?直接修改参数的值,是很容易引发问题的,而且我们很难在一个比较大的程序中发现这种错误,就算是不厌其烦的追踪对象发现这错误,但是又有谁知道里面还有哪个也发生错误呢?所以,如果我们的目的就是修改,而且确保不会再有任何对该对象的使用,是可以用非常量引用的,但是必须注意这点,我们要在阅读代码中有这种心理,如果你看到一个非常量引用,大可认定,该参数已经被修改了,需要对函数的调用必须小心检查,以确保它能按照我们预期的那样正常工作。

      常量引用不允许我们对参数进行修改。这种严格的限制是有道理的,而且正因为这种限定,才使得它比非常量引用使用起来更安全。更重要的是,表面上看起来比非常量引用更苛刻的常量引用,实际使用上却比前者范围更大!比如说,我这里有这样一个函数的声明:void f(int& t);但是我在测试中这么调用:f(2);这会出问题,因为我传进的是一个非常量引用,传递的应该是一个对象,但是我在调用时却将一个常量传进来。于是非常量引用就会失去作用并报错。但是如果是常量引用,却可以应付这种情况!这是因为常量引用有一个特别的特性,就是它会让编译器创建一个临时对象来处理这种情况。让我们来详细的看看这个过程:如果我将声明改为:void f(const int& t);那么在我这样调用函数f()的时候,编译器会创建一个临时对象,对象会被初始化为常量2,然后t会将指向这个临时对象,所以,我们传递的依然是对象而不是一个常量。 所以常量引用可以通过这种机制来解决参数类型不匹配的问题,而且还可以防止参数被修改,使我们的数据更加安全。因此,我们应该尽可能使用常量引用,因为非常量引用能够解决的问题他基本上都能解决(通过临时对象)——除非你真的是想要修改你的参数,而且还可以提供安全保障,何乐不为呢?

         

原文地址:https://www.cnblogs.com/wenjiang/p/2543022.html