`
lovecontry
  • 浏览: 1036531 次
文章分类
社区版块
存档分类
最新评论

C++ const引用详解

 
阅读更多

(1) 在实际的程序中,引用主要被用做函数的形式参数--通常将类对象传递给一个函数.引用必须初始化. 但是用对象的地址初始化引用是错误的,我们可以定义一个指针引用。

1 int ival = 1092;

2 int &re = ival; //ok

3 int &re2 = &ival; //错误

4 int *pi = &ival;

5 int *&pi2 = pi; //ok

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

(3) const引用可以用不同类型的对象初始化(只要能从一种类型转换到另一种类型即可),也可以是不可寻址的值,如文字常量。例如

double dval = 3.14159;

//下3行仅对const引用才是合法的

const int &ir = 1024;

const int &ir2 = dval;

const double &dr = dval + 1.0;

上面,同样的初始化对于非const引用是不合法的,将导致编译错误。原因有些微妙,需要适当做些解释。

引用在内部存放的是一个对象的地址,它是该对象的别名。对于不可寻址的值,如文字常量,以及不同类型的对象,编译器为了实现引用,必须生成一个临时对象,引用实际上指向该对象,但用户不能访问它。

例如:

double dval = 23;

const int &ri = dval;

编译器将其转换为:

int tmp = dval; // double -> int

const int &ri = tmp;

同理:上面代码

double dval = 3.14159;

//下3行仅对const引用才是合法的

const int &ir = 1024;

const int &ir2 = dval;

const double &dr = dval + 1.0;

内部转化为:

double dval = 3.14159;

//不可寻址,文字常量

int tmp1 = 1024;

const int &ir = tmp1;

//不同类型

int tmp2 = dval;//double -> int

const int &ir2 = tmp2;

//另一种情况,不可寻址

double tmp3 = dval + 1.0;

const double &dr = tmp3;

(4) 不允许非const引用指向需要临时对象的对象或值,即,编译器产生临时变量的时候引用必须为const!!!!切记!!

int iv = 100;

int *&pir = &iv;//错误,非const引用对需要临时对象的引用

int *const &pir = &iv;//ok


const int ival = 1024;

int *&pi_ref = &ival; //错误,非const引用是非法的

const int *&pi_ref = &ival; //错误,需要临时变量,且引用的是指针,而pi_ref是一个非常量指针

const int * const &pi_ref = &ival; //正确

//补充

const int *p = &ival;

const int *&pi_ref = p; //正确

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

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

int a = 2;

int &ref1 = a;// OK.有过渡变量。

const int &ref2 = 2;// OK.编译器产生临时变量,需要const引用

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;

下面是测试的一段代码

测试结果

分享到:
评论

相关推荐

    C++const关键字详解

    C++中const关键字详解

    C++ const使用详解

    C++ const使用详解,显浅易懂,适合新手。 绝对值得收藏的技术教程。

    c++中const关键字使用详解

    一 const基础;二 const的初始化;三 作为参数和返回值的const修饰符;四 类成员函数中const的使用;五 使用const的一些建议。

    C++中const关键字详解

    C++中const关键字详解

    C++之const详解

    C++之const详解

    c++中const用法详解

    c++中const用法详解,引用大量实例进行分析!

    Const用法详解 C++

    Const用法详解 C++ const用法非常灵活,正确使用灵活使用是开法人员非常有好处。

    C++ const引用、临时变量 引用参数详解

    C++引用—临时变量、引用参数和const引用 如果实参与引用参数不匹配,C++将生成临时变量。如果引用参数是const,则编译器在下面两种情况下生成临时变量: 实参类型是正确的,但不是左值 实参类型不正确,但可以转换为...

    const 用法详解

    const用法详解 详细介绍C++里const的用法,面试必备!!

    C++ const使用及编译连接详解 PPT版本

    C++ const使用 编译连接详解 PPT版本 非常好用的,我是偷偷从别人电脑里找出来的

    c++中const详解

    ++中的const关键字的用法非常灵活,而使用const将大大改善程序的健壮性,本人根据各方面查到的资料进行总结如下。

    C++中const关键字用法详解及实例和源码下载

    最近在学习C++基础部分,看了两天书,已经看过了一遍,半知半解,回过头来重新看第二遍,深入了解一下C++的基础知识。现在读到了const关键字的用法,书上面讲解的时候并没有给出完整的实例,只是理论的讲解了一些...

    C++中const的用法

    C++const用法详解。这里可以学到C++const的一些用法。

    C语言中const和C++中的const 区别详解

    C语言中const和C++中的const 区别详解 C++的const和C语言的#define都可以用来定义常量,二者是有区别的,const是有数据类型的常量,而宏常量没有,编译器可以对前者进行静态类型安全检查,对后者仅是字符替换,没有...

    c++中关键字const的用法详解

    本文档详细介绍了C++中关键字const的用法,并给出了具体的示例来帮助读者理解

    const关键字详解

    关于C++中的const关键字的用法非常灵活,而使用const将大大改善程序的健壮性

    const用法详解

    const用法详解。面向对象是C++的重要特性.  但是c++在c的基础上新增加的几点优化也是很耀眼的 就const直接可以取代c中的#define 以下几点很重要,学不好后果也也很严重

    C++ 中const对象与const成员函数的实例详解

    C++ 中const对象与const成员函数的实例详解 const对象只能调用const成员函数: #include using namespace std; class A { public: void fun()const { cout&lt;&lt;const 成员函数!&lt;&lt;endl; } void fun()...

    c++中const的使用详解

    Const 是C++中常用的类型修饰符,常类型是指使用类型修饰符const说明的类型,常类型的变量或对象的值是不能被更新的。 1、定义常量(1)const修饰变量,以下两种定义形式在本质上是一样的。它的含义是:const修饰的类型...

Global site tag (gtag.js) - Google Analytics