引用
一.基本概念
1.含义:引用就是给变量起别名。
2.特点:
①引用的类型与实体类型必须相同。
②定义引用时,必须初始化。
③一个实体可以有多个引用。
④ 引用一经初始化它的指向就不会再发生改变。
⑤常引用的值不可更改。
⑥引用作函数的返回值时,要保证实体的生命周期大于函数的生命周期。
比如:
int& add2(int& a, int &b) {
int c = a + b;
return c;
}
int main(){
int a = 2;
int b = 3;
int &sum =add2(a, b);
cout << a<<"+"<<b <<"="<< endl;
cout << sum << endl;
return 0;
}
我们期望得到的结果是5,但是输出的结果却是这样的:
原因就是:c是临时变量,当函数调用完毕后,临时变量的内容就被释放了。所以c原来内存中的内容就成了随机值
⑦引用的大小:就是对应实体的大小。
二.引用与指针的区别
1.大小:
指针的大小与操作系统有关。32位下4B,64位下8B;
但是引用的大小是与其实体有关的,它的大小就是实体的大小。
2.空间开辟的方式
(1)指针是再内存中开辟一段空间来存放目标地址
(2)引用与实体指向的地址是相同的,不开辟内存空间(语法上)
但是底层实现上引用是用指针的方式来实现的
3.效率:引用==指针
观察下面代码:
返回值类型分别是结构体类型和结构体引用类型
typedef struct A { //C++中可以不需要加typedef,A本身就是类型名
int arr[10000];
};
A a;
A testVal() {
return a;
}
A& testRef(){
return a;
}
A* testPointer(){
return &a;
}
int main() {
int num = 100000;
cout << CLOCKS_PER_SEC << endl;
//测试返回引用
size_t Refbegin = clock();
for (int i = 0; i < num; i++) {
testRef();
}
size_t Refend = clock();
cout << "testRef:" << (Refend - Refbegin) << endl;
//测试返回值
size_t Valbegin = clock();
for (int i = 0; i < num; i++) {
testVal();
}
size_t Valend = clock();
cout << "testVal:" << (Valend - Valbegin) << endl;
//测试返回指针
size_t Point_begin = clock();
for (int i = 0; i < num; i++) {
testPointer();
}
size_t Point_end = clock();
cout << "testPointer:" << (Point_end - Point_begin) << endl;
return 0;
}
输出结果是这样的:
可见传值的效率是大大低于传引用和传指针的。