zoukankan      html  css  js  c++  java
  • C++引用

    引用是别名而非指针,引用与指针的区别:

    1、不存在空引用

    2、所有的引用都要初始化

    3、一个引用永远指向用来对它初始化的那个对象

    本文地址:http://www.cnblogs.com/archimedes/p/cpp-reference.html,转载请注明源地址。

    引用是一个现有对象的别名,用对象来初始化引用后,对象名字或引用的名字都可以用于指向该对象

    int a=12;
    int &ra=a;  //ra是a的别名
    --ra;  //a==11
    a=10;  //ra==10
    int *ip=&ra;   //ip指向a

    一些编译器可以捕捉到那些明显的创建空引用的尝试:

    Employee &anEmployee=*static_cast<Employee*>(0)   //error!

    有些却无法侦测到不那么明显的空引用:
    Employee *getAnEmployee();
    //...
    Employee &anEmployee=*getAnEmployee();   //可能是糟糕的代码
    if(&anEmployee==0)  //未定义的行为

    如果getAnEmployee返回的是一个空指针,那么其后的代码行为就是未定义的,最好使用一个指针来存放getEmployee返回的结果:

    Employee *employee=getAnEmployee();
    if(employee)//...

    引用常常成为函数参数的优秀选择:

    template<typename T>
    void swap(T &a, T &b) {
        T temp=a;
        a=b;
        b=temp;
    }
    //...
    int x=1,y=2;
    swap(x,y);

    引用所指向的对象可以没有名字:

    int grade[MAX];
    //...
    swap(grade[i],grade[j]);

    考虑如下函数:

    inline void set_2d(float *a, int i, int j, int m) {
        a[i*m+j]=a[i*m+j]*a[i*m+j]+a[i*m+j];
    }

    使用引用可以简化和优化:

    inline void set_2d(float *a, int i, int j, int m) {
        float &r=a[i*m+j];
        r=r*r+r;
    }

    一个指向非常量的引用是不可以用字面值或临时值进行初始化的:
    double &d=12.3 //错误!

    swap(string("Hello"),string(", World"));

    然而一个指向常量的引用就可以:

    const double &cd=12.3;  //OK
    template<typename T>
    T add(const T &a, const T &b) {
        return a+b;
    }
    //...
    const string &greeting=add(string("Hello"), string(", World"));  //OK


     

  • 相关阅读:
    java之md5加密算法
    springboot之快速创建项目
    java之idea打jar包
    java只http改成https访问
    springboot之读取配置文件
    springboot之项目打包
    Git之fatal: remote origin already exists
    WebStorm ES6 语法支持设置和ES6语法的JS文件编译为ES5语法文件
    转 JavaScript里的数组转化新方法Array.From
    网页特殊符号HTML代码大全
  • 原文地址:https://www.cnblogs.com/wuyudong/p/cpp-reference.html
Copyright © 2011-2022 走看看