zoukankan      html  css  js  c++  java
  • 尽可能使用常量引用的理由

          由于本学期学校开了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会将指向这个临时对象,所以,我们传递的依然是对象而不是一个常量。 所以常量引用可以通过这种机制来解决参数类型不匹配的问题,而且还可以防止参数被修改,使我们的数据更加安全。因此,我们应该尽可能使用常量引用,因为非常量引用能够解决的问题他基本上都能解决(通过临时对象)——除非你真的是想要修改你的参数,而且还可以提供安全保障,何乐不为呢?

             

  • 相关阅读:
    二分练习题4 查找最接近的元素 题解
    二分练习题5 二分法求函数的零点 题解
    二分练习题3 查找小于x的最大元素 题解
    二分练习题2 查找大于等于x的最小元素 题解
    二分练习题1 查找元素 题解
    code forces 1176 D. Recover it!
    code forces 1173 B. Nauuo and Chess
    code forces 1173 C. Nauuo and Cards
    吴恩达深度学习课程笔记-15
    吴恩达深度学习课程笔记-14
  • 原文地址:https://www.cnblogs.com/wenjiang/p/2543022.html
Copyright © 2011-2022 走看看