• C++_引用变量探究


    什么是引用

    引用变量是已定义变量的别名。

    如何定义引用变量:

      int rats;

      int & rodents = rats;

    其中&不失地址运算符,而是类型标识符的一部分。就行声明char*是指的是指向char的指针一样。

    int &指的是指向int的引用。

    引用看起来和指针很类似,但是还是不太一样的。

    很重要一点:引用必须在声明引用时将其初始化!!

    int rat;

    int & rodents;

    rodent =rat;  // 这样是错误的;

    为什么要这样规定?

    这是因为引用其实是一个const指针;const变量的特点就是在声明的时候当然得初始化啦,一旦初始化完毕就不能修改。

    也就是说引用一旦跟某个变量关联起来,就一直效忠于它,在引用变量的整个生命周期里。是不是很专一?

    所以:int & rodents =rats;

    实际上是以下代码的伪装表示:

    int * const pr =&rats;

    引用可以用来做什么?

    1)引用可以用来做函数的参数

    1 void swapr(int & a, int & b)
    2 {
    3     int temp;
    4     temp = a;
    5     a = b;
    6     b = temp;  
    7 }

    当使用按引用传递参数的时候,类似于按指针传递参数(C++中大多用按引用传递取代按指针传递了)。

    函数的形参可以直接对原始变量(实参)进行操作了,而不是在函数中产生原始变量实体的副本。

    一般按值传递参数时,要给形参分配内存空间,形参变量就是原始变量(实参)的副本。

    对于大块数据而言,按值传递的内存开销比较大,效率也比较低下。

    而采用按址传递(按引用和按指针)可以避免大块的数据全部压入栈中。

    2)常引用

    在普通引用定义前面加一个只读标识符const。

    1 double refcube(const double & ra)
    2 {
    3     return ra * ra * ra;  
    4 }

    这样做的目的是可以定义一个变量的只读别名,而不用担心变量的值被别名意外地改掉。

    3)引用作为函数返回值

    为什么要返回引用?答案:效率会更高!

    返回引用和传统返回机制的不同之处;

    double m = sqrt(16.0);

    cout << sqrt(25.0);

    第一条语句中,值4.0被复制到一个临时位置,然后被复制给m。

    在第二天语句中,值5.0倍复制到一个临时位置,然后被传递给cout

    dup = accumulate(team,five);

    如果accumulate()返回一个结构,而不是指向结构的引用,将把整个结构复制到一个临时位置,再将这个拷贝复制给dup。

    但在返回值为引用时,将直接把team复制到dup,其效率更高。

    引用作为函数返回值时需要注意:

    const free_throws & clone2(free_throws & ft)
    {
        free_throws newguy;    //first step to big error
        newguy =ft;
        return newguy;
    }

      不能返回指向局部变量的引用,局部变量在被调用函数返回后就被销毁掉了。那么它返回的引用所指向的内存已经没有任何意义,运行时会出现不可预知的错误。所以以上代码是错误的。

    正确的操作如下:

    1 free_throws & accumulate(free_throws & target, const free_throws & source)
    2 {
    3     target.attempts += source.attempts;
    4     tartget.made += source.made;
    5     set_pc (target);
    6     return target;
    7 }

    有的时候为了避免在设计中添加模糊的特性,因为模糊的特性增加的犯错的机会。

    所以还可以将返回类型声明为const引用。返回类型是不可修改的左值,以下语句就不合法了:

    accumulate(dup, five) = four;  //not allowed

  • 相关阅读:
    Struts2学习总结——文件上传与下载
    String.StartsWith与 EndsWith在大量使用时效率果然极低
    使用CXF实现基于Rest方式的WebService
    使用CXF实现基于Soap协议的WebService
    Hibernate单向“一对多”关联
    Hibernate单向“多对一”关联
    Hibernate单向“一对一”关联
    Spring使用经验之Listener综述
    Eclipse3.4以上使用dropins的插件安装方式
    数据库第一、二、三范式
  • 原文地址:https://www.cnblogs.com/grooovvve/p/10117645.html
Copyright © 2020-2023  润新知