关于引用使用场景,指针和引用的区别
# 引用
关于引用
《C++primer 5》中关于引用的描述是为对象起一个别名,定义引用时,将引用和它的初始值绑定在一起。实际上定义一个引用后,不会给引用再分配内存,引用的地址就是初始值的地址;
int a = 10;
int *b = &a;
int &c = a;
printf("a = %p\n",&a);
printf("b = %p\n",&b);
printf("c = %p",&c);
/*
运行后会发现打印出来的 c 的地址和 a的地址一样。而指针本身是需要分配内存的
*/
引用的用途如下:
①起别名:给后边代码要用到的变量起一个较短的别名,而且能减少后边使用时的拷贝构造。
DateTime *cur_datetime = get_cur_datetime();
Date &cur_date = cur_datetime->date;
//用cur_date 来代替cur_datetime->date,而且不会产生拷贝
std::cout<<cur_date<<std::endl;
②引用传参:
Object obj;
void func(Object obj);
//在函数调用时会对对象进行一次拷贝,创建一个临时对象常熟func函数
//效率低下且浪费资源
void func(Object *obj);
//传递对象的指针,这样免去了拷贝,但是这样仍然不妥,因为有obj是空指针的可能,在函数中要判断obj不是空指针再进行操作。
void func(const Object &obj);
//引用的实现在汇编角度和指针一样,因此并不会有性能的减少,而且引用必须初始化绑定一个初始值,因此不会产生空指针
//作为参数时引用和const总是一起出现
③作为函数返回值:
//想要实现:
ArrayInt arr;//构造了一个数组对象
arr[10] = 10;//使用下标来访问数组对象中的一个。
//实际上述调用等价于下方,在对象中对运算符[]进行了重载。
arr.operator[](10) = 10;
//实现方法:
/*
一.返回值为指针,但是存在缺点,比如你想访问的时候要用一下方式
*(arr[10]) = 10; //并不能达到想要的目标
*/
int *ArrayInt::operator[](unsigned int index){
return this->arr[index];
}
//返回值为引用,访问时可以用arr[10] = 10来访问;
int &ArrayInt::operator[](unsigned int index){
return this->arr[index];
}
指针和引用的区别
1.指针可以不初始化,引用必须初始化
2.指针可以为空,引用不能为空
3指针可以更换目标,引用不能更换目标