C++:const和引用

来源:互联网 发布:js获取索引值 编辑:程序博客网 时间:2024/05/11 03:01

上面一篇博客我们已经介绍了基本的const,对于这篇博客,

先说一下什么是引用:

引用说白了就是为对象另外起了一个名字,引用类型引用另一种类型。

定义方式:

 将声明符写成&d的形式来定义引用类型其中d是声明的变量名,

int size = 100;int &sum = size;

要注意的是:

我们在引用的时候必须要给引用赋值,

例如:

int &size;

这种方式是不可以的,在一般的初始化变量的时候,初始值会被拷贝到新建的对象上,而定义引用时,程序将引用和 它 的初始值绑定到一起,而不是通过拷贝这种方式,一旦初始化完成,引用和他的初始值是绑定在一起的。

我们需要记住这段话:

引用就是对象的一个别名,所以引用并非是对象,而是对象的一个别名。定义了一个引用之后所有的操作都是在引用绑定的对象上进行的。


那么问题来了:

我们可不可以定义引用的引用呢?答案当然是不可以了,为什么呢?因为我们说引用只是给对象起了个另外的名字,引用并不是一个对象,所以我们不能这么做,

当然我们是可以给对象绑定很多引用。


另外,值的注意的是:

其他所有类型的引用和要绑定的对象都要严格匹配,另外,引用只能绑定到对象上,而不能绑定到字面值或者某个表达式的计算结果上。



好了,引用的基本东西介绍完了,那么.


来看先const 和 引用:

我们可以把引用绑定到const对象上,其绑定的方式和 绑定到其他对象是一样的,称为常量引用,与普通的引用不同的是,对常量的引用不能被用于修改它所绑定的对象

例如:

const int ci = 100;const int &r1 = ci;  //正确的,引用及对象都是常量r1 = 11 //这是错误的,因为r1是对常量的引用int &r2 = ci //错误的。不能让一个非常量引用指向一个常量对象;


上面我们说过,引用的类型必须要跟所指向的类型保持一致,但是有两个例外第一种例外是在初始化常量引用时允许使用任意表达式作为初始值,只要该表达式的结果能转化为引用的类型就行了,尤其,允许为一个常量引用绑定非常量的对象,字面值甚至一个一般表达式。

如:

int i= 42;const int &r1 = i;const int &r2 = 42;const int &r3 = r1 * 2;

这些都是合法的。


那么问题来了,如果在类型不一致的时候会发生时候事情呢?

首先:

double dval = 3.14;const int & r1 = dval;

此处r1 是int型引用,但是dval为double 类型,那么为了确保r1 绑定一个对象,编译器会把上述的代码变成:

const int temp = dval;const int &r1 = temp;

在 这种情况下r1 绑定了一个临时量.

那么如果r1 不是一个常量,会发生什么呢?

如果r1 不是一个常量,就允许对 r1 赋值,这样改变r1 所引用对象的值,但是此时绑定的是一个临时量,而非dval,既然我们将r1 引用dval,那么久肯定相同过r1 改变dval 的值,否则为什么要给r1 赋值呢?

 所以C++规定这行为是非法的。

QAQ

 


1 0
原创粉丝点击