关于引用使用场景,指针和引用的区别

                                                 # 引用

关于引用

《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指针可以更换目标,引用不能更换目标

posted @ 2021-01-19 21:30  Emiria  阅读(267)  评论(0编辑  收藏  举报