C++ 引用

C++ 引用

定义:

  • 已定义的变量的别名。

使用方法:

  • 声明引用时必须将其初始化:
    1 int rats=101; 
    2 int & rodents=rats; 


    注意:引用一旦被建立不能更改其与某个变量之间的关系,即引用不能再表明其余变量。程序员

  • 用做函数参数

用做函数参数时的注意事项:

  • 当实参与引用参数不匹配时:

    • 若参数为 const 引用且函数调用的参数不是左值或与相应的 const 引用参数的类型不匹配,则 C++ 将建立类型正确的匿名变量,将函数调用的参数的值(实参值)传递给该匿名变量(实参值能够被强制转换为相应类型时),并让参数来引用该变量。这些匿名变量只在函数调用期间存在,此后编译器即可以随意将其删除。所以对于实参为 const 引用的 C++ 函数,若是实参不匹配且能够发生强制类型转换,则其行为相似于按值传递。(例外的是有时非 const 右值引用参数也可达到相似生成匿名变量的效果:如 double && 形参能够输入无关左右值的 int 和 const int 类型实参)

注(什么是左值?):左值参数是可被引用的数据对象,例如变量、数组元素、结构成员、引用和解除引用的指针都是左值。非左值包括字面常量(用引号括起的字符串除外,他们由其地址表示)和包含多项的表达式。编程

  • 尽量使用 const:

    • 使用 const 能够避免无心中修改数据的编程错误。
    • 使用 const 能使函数能处理 const 和非 const 实参,不然将只能接受非 const 数据。
    • 使用 const 引用使函数可以正确生成并使用临时变量。数组

函数返回引用时须要注意的事项:

  • 避免返回函数终止时不在存在的内存单元引用,解决办法:函数

    • 返回一个做为参数传递给函数的引用。
    • 用 new 来分配新的存储空间。
  • 必要时将返回类型声明为 const 引用,可避免犯糊涂;经过省略 const ,能够编写更简短代码,但其含义也更模糊,增长了犯错的机会,然而有时省略 const 确实有道理。
    1 free_throws & clone(free_throws & ft)
    2 {
    3     ...
    4     return ft;
    5 }
    6 
    7 clone(ft)=four; //it's allowed, four covered ft
    const free_throws & clone(free_throws & ft)
    {
        ...
        return ft;
    }
    
    clone(ft)=four; //it's not allowed
    display(clone(ft)); //it's allowed, you can ues it like this

     

将引用用于对象:

  • 基类引用能够指向派生类对象,而无需进行强制类型转换。
    void file_it(ostream & os)
    {
        ...
    }
    ofstream fout;
    file_it(fout);

    例如:参数 os (其类型为 ostream & )能够指向 ostream 对象(如 cout ),也能够指向 ofstream 对象(如 fout )。this

什么时候使用引用参数:

  • 程序员可以修改调用函数中的数据对象。
  • 经过传递引用而不是整个数据对象,能够提升程序的运行速度。
  • 何时使用引用、何时使用指针,通常性指导原则是
    • 对于使用传递的值而不做修改的函数:
      • 若是数据对象很小,如内置数据类型或小型结构,则按值传递。
      • 若是数据对象是数组,则使用指针,由于这是惟一的选择,并将指针声明为指向 const 的指针。
      • 若是数据对象是较大的结构,则使用 const 指针或 const 引用,以提升程序的效率。这样能够节省复制结构所需的时间和空间。
      • 若是数据对象是类对象,则使用 const 引用。类设计的语义经常要求使用引用,这是 C++ 新增这项特性的主要缘由。所以,传递类对象参数的标准方式是按引用传递。
    • 对于修改调用函数中数据的函数:
      • 若是数据对象是内置数据类型,则使用指针。若是看到诸如 fixit(&x) 这样的代码(其中 x 是 int ),则很明显,该函数将修改 x 。
      • 若是数据对象是数组,则只能使用指针。
      • 若是数据对象是结构,则使用引用或指针。
      • 若是数据对象是类对象,则使用引用。

 

 

右值引用:

  • C++ 11 新增了右值引用——这种引用可指向右值,使用 && 声明,以前的引用称为左值引用。
相关文章
相关标签/搜索