zoukankan      html  css  js  c++  java
  • 引用和const 引用的区别(转自chinaitlab)

    原文地址:http://c.chinaitlab.com/basic/747981.html

    1)在实际的程序中,引用主要被用做函数的形式参数--通常将类对象传递给一个函数.
    引用必须初始化. 但是用对象的地址初始化引用是错误的,我们可以定义一个指针引用.
    int ival = 1092;
    int &re = ival;   //ok
    int &re2 = &ival;   //错误
    int *pi = &ival;
    int *&pi2 = pi;   //ok

    (2)一旦引用已经定义,它就不能再指向其他的对象.这就是为什么它要被初始化的原因.

    (3)const引用可以用不同类型的对象初始化(只要能从一种类型转换到另一种类型即可),也可以是
    不可寻址的值,如文字常量。例如
    double dval = 3.14159;
    //仅对const引用才是合法的
    const int &ir = 1024;
    const int &ir2 = dval;
    const double &dr = dval + 1.0;
    上面,同样的初始化对于非const引用是不合法的,将导致编译错误。原因有些微妙,需要适当做些解释。
    引用在内部存放的是一个对象的地址,它是该对象的别名。对于不可寻址的值,如文字常量,以及不同

    类型的对象,编译器为了实现引用,必须生成一个临时对象,引用时间上指向该对象,但用户不能访问它。
    例如:  double dval = 23;
           const int &ri = dval;
    编译器将其转换为:
           int temp = dval;
           const int &ri = temp;

    (4)不允许非const引用指向需要临时对象的对象或值
    const int ival = 1024;
    int *&pi_ref = &ival;    //错误,非const引用是非法的
    const int *&pi_ref = &ival;   //错误,pi_ref是一个非常量指针,而指针,而ival不可变
    const int * const &pi_ref = &ival;  //正确
    //补充
    const int *p = &ival;
    const int *&pi_ref = p;  //正确

    ********对于const int *const & pi_ref = &iva; 具体的分析如下:*********

    1.不允许非const引用指向需要临时对象的对象或值


        int a = 2;
        int & ref1 = a;             // OK.有过渡变量。
        int const & ref2 = 2;   // OK.编译器产生临时变量,直接引用。

    2.地址值是不可寻址的值

    int * const &ref3 = &a;   // OK;

    3.于是,用const对象的地址来初始化一个指向指针的引用

  • 相关阅读:
    ios des加密
    testng-注解之@BeforeGroups、@AfterGroups +分组测试
    testng -忽略测试
    testng -注解之@BeforeSuite、@AfterSuite
    jmeter创建测试计划,执行post请求
    jmeter进行压力测试
    jmeter在mac电脑上安装使用
    java -获取变量类型
    java中枚举类enum
    java的日期与时间,Date ,SImpleDateFormat(), Calendar
  • 原文地址:https://www.cnblogs.com/finallyliuyu/p/1835932.html
Copyright © 2011-2022 走看看