Jecho

导航

C++引用与const引用比较

(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对象的地址来初始化一个指向指针的引用

 

  const int b = 23;

    const int *p = &b;

    const int *& ref4 = p;

    const int * const & ref5 = &b;   //OK

const 引用的语义到底是什么?

 

最后,我们可能仍然不明白 const 引用的这个 const 的语义是什么

const 引用表示,试图通过此引用去 ( 间接 ) 改变其引用的对象的值时,编译器会报错!

这并意味着,此引用所引用的对象也因此变成 const 类型了。我们仍然可以改变其指向对象的值,只是不通过引用

下面是一个简单的例子:

 1 #include <iostream>

 2 using namespace std;

 3

 4 int main()

 5 {

 6     int val = 1024;

 7     const int &ir = val;

 8    

 9     val++;

10     //ir++;

11

12     cout << val << " " << ir << endl;

13

14     return 0;

15 }

 

 

其中第10行,如果我们通过ir来改变val的值,编译时会出错。但是我们仍然可以通过val直接改变其值(第9行)

 

总结:const引用只是表明,保证不会通过此引用间接的改变被引用的对象!

另外,const既可以放到类型前又可以放到类型后面,放类型后比较容易理解:

string const *t1;

const string *t1;

typedef string* pstring;string s;

const pstring cstr1 = &s;就出错了

但是放在类型后面不会出错:

pstring const cstr2 = &s;

posted on 2013-05-12 19:01  Jecho  阅读(285)  评论(0编辑  收藏  举报