To shine,not be illuminated.
1 引用概念
引用 不是新定义一个变量,而 是给已存在变量取了一个别名 ,编译器不会为引用变量开辟内存空间,它和它引用的变量 共用同一块内存空间。
比如:你的正式姓名和你的小名或者别名。
使用方法:
类型& 引用变量名(对象名) = 引用实体;
我们可以来举个例子:
int main() { int a = 10; int& sa = a; int b = 20; int& sb = b; return 0; }
通过调试我们也能够发现a和sa其实共用的是同一块空间,这也就解释了为啥引用只是给变量取了一个新名字,并没有为引用变量开辟新的空间。
注意:正确用法:引用类型必须和引用实体是同种类型的
2 引用特性
- 1. 引用在定义时必须初始化
- 2. 一个变量可以有多个引用
- 3. 引用一旦引用一个实体,再不能引用其他实体
我们一个一个来看:
假如引用变量不初始化
int main() { int a = 10; int& sa ; return 0; }
这种方式显然是会直接报错的:
一个引用变量可以有多个引用:
int main() { int a = 10; int& b = a; int& c = a; return 0; }
这里b和c都是a的别名,修改其中任何一个这3个的值都会发生改变。
假如拿一个已经引用过的实体再去引用其他实体:
这样写直接就报错了,有人会想到换一种方式写呢:
int main() { int a = 10; int& b = a; int e = 20; b = e; return 0; }
这里b还是e的引用吗?
显然不是的,这里只是将e的值赋给了b,b还是a的引用,程序结束后a和b都应该为20,我们可以打开监视窗口看看:
3 常引用
我们来看下面这个栗子:
int main() { const int a = 10; int& b = a; return 0; }
上述代码能够被编译通过吗?
很明显这种写法是错误的,C++认为这种写法是不安全的,const int是只读权限,而int&却是既有读权限也有写权限,像这种权限放大C++是不支持的,权限缩小或者权限相等C++是支持的。
比如下面这两种写法都是合法的:
int main() { //权限相等 const int a = 10; const int& b = a; //权限缩小 int c = 20; const int& d = c; return 0; }
再来看下面一段代码:
int main() { double d = 12.12; int& i = d; return 0; }
上面代码能够编译通过吗?
我们可能会想:引用类型和引用实体必须是同一种类型的,所以说就错误了呗。
引用类型和引用实体一定要是同一种类型的吗?
我们将程序再修改一下:
我们发现程序居然能够跑过,只是错误变成了一个警告,为什么呢?
通过C语言的知识我们知道:double类型的d如果要转换成int类型的i是会发生截断的,首先会用一个临时变量来保存被截断后的值,再将该值换一个新的名称,d本身是不会发生任何改变的。而这个临时变量是具有常数性的(这个很重要,后面也会反复的提及)不能被修改,也就是不能够写,只能够读。由于权限不能够升高,所以我们必须得加const才行。
我们再来回答上面的问题,引用类型和引用实体一定要是同一种类型的吗?
如果想要正确的使用,这句话显然没有什么毛病,但是并不是说引用类型和引用实体不是同一种类型程序一定就会报错。
建议:以后我们引用一个实体是如果不想改变这个实体,最好加上const.