c++ const引用和非const引用

const引用可读不可改,与绑定对象是否为const无关,注意区分const引用与对const对象的引用

const引用可读可改,只可与非const对象绑定

const int ival = 1024;

const int &refVal = ival; // ok: both reference and object are const

int &ref2 = ival;            // error: nonconst reference to a const object

 

非const引用只能绑定到与该引用同类型的对象。

const引用则可以绑定到不同但相关的类型的对象或绑定到左值。

const引用可以初始化为不同类型的对象或者初始化为右值,如字面值常量:

int i = 42;

// legal for const references only

const int &r = 42;

const int &r2 = r + i;//同样的初始化对于非const引用却是不合法的,而且会导致编译时错误。

double dval = 3.14;

const int &ri = dval;

编译器会把这些代码转换成如以下形式的编码:

int temp = dval;          // create temporary int from the double

const int &ri = temp;   // bind ri to that temporary

 

const int t = 9;
const int& k = t;
cout<<&k<<endl;
cout<<&t<<endl;

输出是

0012FF6C
0012FF74

  int t = 9;
int& k = t;
cout<<&k<<endl;
cout<<&t<<endl;

输出是

0012FF74
0012FF74

如果是对一个常量进行引用,则编译器首先建立一个临时变量,然后将该常量的值置入临时变量中,对该引用的操作就是对该临时变量的操作。

const 和 引用

   int & != int
   引用是一种类型
   const int ==int
///const 修饰 在非引用 和 指针 情况下  不改变类型
   const int &  != int &
   const int *   !=int *   只有 const 类型 指针能接受 const 类型 地址
  非引用类型 必须精确匹配
   float  i=2.22f;
   int & p= i;///error
 const int & p=i;//ok,零时对象,也就是说其可以接受 个右值或 不匹配类型
   特别需要注意 非const引用必需 是个精确匹配的左值
  
   const int a=100;
   const int * & p=& a//error,& a是 const int * , 但其地址是个右值,只有 const 才能接受右植
   const int * const & p= &a//ok;不是对“const”的引用不能绑定到非 lvalue
  int a=10;
int *& b=&a///错误
int *const & b=&a;//ok
但 char * a="good";//"good" const char [5]类型---->const char*   是 achar* ;这个是编译器的例外
 
引用:没有指针语法的指针,非const引用只能接受左值
指针的引用相当于一个指针的指针,常用于函数参数中来改变指针本身的值(外部同时也改变)

       void f(int *&p)
{
p=new int [5];//外部也改变了
}
             void f(int **p)
{
*p=new int [5];//外部也改变
}
                void f(int * p)
{
p=new int [5];//外部不改变
}
const 指针都可以给void *;
void *p =(int) 0x3444;

C++引用与const引用

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

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

3const引用可以用不同类型的对象初始化(只要能从一种类型转换到另一种类型即可),也可以是
不可寻址的值,如文字常量。例如
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对象的地址来初始化一个指向指针的引用

    const int b = 23;
    const int *p = &b; 
    const int *& ref4 = p;
    const int *const & ref5 = &b;   //OK

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值