1.引用
1.1引用概念
引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。
类型引用变量名(对象名)=引用实体;
注意:引用类型必须和引用实体是同种类型的
1.2引用特性
1.引用在定义时必须初始化
2.一个变量可以有多个引用
3.引用一旦引用一个实体,再不能引用其他实体
1.3常引用
上面提到,引用类型必须和引用实体是同种类型的。但是仅仅是同种类型,还不能保证能够引用成功,我们若用一个普通引用类型去引用其对应的类型,但该类型被const所修饰,那么引用将不会成功。
我们可以将被const修饰了的类型理解为安全的类型,因为其不能被修改。我们若将一个安全的类型交给一个不安全的类型(可被修改),那么将不会成功。
1.4使用场景
1.做参数
2.做返回值
下面代码输出什么结果?为什么?
注意:如果函数返回时,出了函数作用域,如果返回对象还未还给系统,则可以使用引用返回,如果已经还给系统了,则必须使用传值返回。
1.5传值、传引用效率比较
以值作为参数或者返回值类型,在传参和返回期间,函数不会直接传递实参或者将变量本身直接返回,而是传递实参或者返回变量的一份临时的拷贝,因此用值作为参数或者返回值类型,效率是非常低下的,尤其是当参数或者返回值类型非常大时,效率就更低。
值和引用的作为返回值类型的性能比较
#includetime.h
structA{inta[];};
Aa;
//值返回
ATestFunc1(){returna;}
//引用返回
ATestFunc2(){returna;}
voidTestReturnByRefOrValue()
{
//以值作为函数的返回值类型
size_tbegin1=clock();
for(size_ti=0;i0;++i)
TestFunc1();
size_tend1=clock();
//以引用作为函数的返回值类型
size_tbegin2=clock();
for(size_ti=0;i0;++i)
TestFunc2();
size_tend2=clock();
//计算两个函数运算完成之后的时间
cout"TestFunc1time:"end1-begin1endl;
cout"TestFunc2time:"end2-begin2endl;
}
通过上述代码的比较,发现传值和指针在作为传参以及返回值类型上效率相差很大。
1.6引用和指针的区别
在语法概念上引用就是一个别名,没有独立空间,和其引用实体共用同一块空间。
在底层实现上实际是有空间的,因为引用是按照指针方式来实现的。