【c++】引用

简介: 【c++】引用

【c++】引用

1.引用的概念

引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间比如:李逵,在家称为"铁牛",江湖上人称"黑旋风"


类型& 引用变量名(对象名) = 引用实体;

#include<iostream>
using namespace std;
void TestRef()
{
  int a = 10;
  int& ra = a;//<====定义引用类型
  printf("%p\n", &a);
  printf("%p\n", &ra);
}
int main()
{
  TestRef();
}

注意:引用类型必须和引用实体同种类型

2.引用特性

  1. 引用在定义时必须初始化
  2. 一个变量可以有多个引用
  3. 引用一旦引用一个实体,再不能引用其他实体
void TestRef()
{
   int a = 10;
   // int& ra;   // 该条语句编译时会出错
   int& ra = a;
   int& rra = a;
   printf("%p %p %p\n", &a, &ra, &rra);  
}

3.常引用

void TestConstRef()
{
    const int a = 10;
    //int& ra = a;   // 该语句编译时会出错,a为常量
    const int& ra = a;
    // int& b = 10; // 该语句编译时会出错,b为常量
    const int& b = 10;
    double d = 12.34;
    //int& rd = d; // 该语句编译时会出错,类型不同
    const int& rd = d;
}

4.使用场景

1. 做参数

void Swap(int& left, int& right)
{
   int temp = left;
   left = right;
   right = temp;
}

2. 做返回值

int& Count()
{
   static int n = 0;
   n++;
   // ...
   return n;
}

下面代码输出什么结果?为什么?

int& Add(int a, int b)
{
    int c = a + b;
    return c;
}
int main()
{
    int& ret = Add(1, 2);
    Add(3, 4);
    cout << "Add(1, 2) is :"<< ret <<endl;
    return 0;
}

注意:如果函数返回时,出了函数作用域,如果返回对象还在(还没还给系统),则可以使用引用返回,如果已经还给系统了,则必须使用传值返回

5.传值、传引用

1.传值、传引用效率比较

以值作为参数或者返回值类型,在传参和返回期间,函数不会直接传递实参或者将变量本身直接返回,而是传递实参或者返回变量的一份临时的拷贝,因此用值作为参数或者返回值类型,效率是非常低下的,尤其是当参数或者返回值类型非常大时,效率就更低

#include<iostream>
#include <time.h>
using namespace std;
struct A { int a[10000]; };
void TestFunc1(A a) {}
void TestFunc2(A& a) {}
void TestRefAndValue()
{
  A a;
  // 以值作为函数参数
  size_t begin1 = clock();
  for (size_t i = 0; i < 10000; ++i)
    TestFunc1(a);
  size_t end1 = clock();
  // 以引用作为函数参数
  size_t begin2 = clock();
  for (size_t i = 0; i < 10000; ++i)
    TestFunc2(a);
  size_t end2 = clock();
  // 分别计算两个函数运行结束后的时间
  cout << "TestFunc1(A)-time:" << end1 - begin1 << endl;
  cout << "TestFunc2(A&)-time:" << end2 - begin2 << endl;
}

2.值和引用的作为返回值类型的性能比较

通过上述代码的比较,发现传值和指针在作为传参以及返回值类型上效率相差很大

6.引用和指针的区别

语法概念上引用就是一个别名,没有独立空间,和其引用实体共用同一块空间

底层实现上实际是有空间的,因为引用是按照指针方式来实现

int main()
{
    int a = 10;
    int& ra = a;
    ra = 20;
    int* pa = &a;
    *pa = 20;
    return 0;
}

我们来看下引用和指针的汇编代码对比

引用和指针的不同点:

  1. 引用概念上定义一个变量的别名,指针存储一个变量地址。
  2. 引用在定义时必须初始化,指针没有要求
  3. 引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何一个同类型实体
  4. 没有NULL引用,但有NULL指针
  5. 在sizeof中含义不同引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32位平台下占4个字节)
  6. 引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小
  7. 有多级指针,但是没有多级引用
  8. 访问实体方式不同,指针需要显式解引用,引用编译器自己处理
  9. 引用比指针使用起来相对更安全

语法上区别

  • 引用是别名,不开空间;指针是地址,需要开辟空间存地址
  • 引用必须初始化,指针无要求
  • 引用不能改变指向,指针可以
  • 引用相对更安全,没有空引用,但是有空指针;容易出现野指针,但是不容易出现野引用

底层区别

  • 汇编层面上,没有引用,都是指针,引用编译后也转换成指针了
相关文章
|
算法 前端开发
钉钉文档协同编辑背后的核心技术原理
有人说,互联网给人类社会带来最深层次的变革是改变了人与人协作的方式,将信息传播的成本大幅降低。身在互联网行业之中,研究信息传播的方式方法,是我们的日常功课。
钉钉文档协同编辑背后的核心技术原理
|
7月前
|
存储 消息中间件 Kafka
中原银行实时场景企业级解决方案
中原银行实时数据开发平台负责人杜威科在Flink Forward Asia 2024分享了银行业实时数据处理的经验。内容涵盖需求分析、解决方案、场景案例与现状展望。银行业需构建全链路、全场景的企业级实时数据平台,解决动账场景下的复杂计算需求。通过Flink+Paimon方案,实现高效更新、低成本存储与便捷查询。案例包括账户表实时更新入湖、交易协同优化、实时图应用、海量数据存储及业务人员易用性建设。未来目标是实现上千张表实时入湖,缩短延迟并探索AI结合的新场景。
290 2
中原银行实时场景企业级解决方案
|
8月前
|
人工智能 编解码 API
刚刚,通义万相模型能力重磅升级!
刚刚,通义万相模型能力重磅升级!
|
芯片
连串口通信都懂的网工,绝对不一般!
连串口通信都懂的网工,绝对不一般!
425 0
|
存储 SQL 监控
SLS新版告警自助排查系列之告警监控
在SLS告警中,告警监控通过对数据源的查询监控,然后产生告警,并将告警发送到告警管理,告警管理会对告警进行降噪处理包括合并抑制静默后,在将告警发送给行动管理,最终发送通知到用户配置的接收渠道。在整个过程中,告警监控作为告警的源头,决定着告警是否能准确的发出。在配置告警监控规则时,配置不当或者配置错误都会导致告警不能触发或者不是希望的触发。本文主要介绍在告警监控中如何进行自助排查问题。
883 0
|
边缘计算 开发工具 UED
互联网新半场的流量生态——阿里云定向免流方案
当你正在游戏中肆意厮杀时,在你跟美女主播互动畅聊时,突然收到这样一条短信,你会不会心头一紧呢?80%的调查反馈显示,是的(个别土豪除外)。毕竟5块钱30M流量就能用一个月的时代已经过去了,我们玩的游戏也从XX玛丽、贪吃X等单机弱联网游戏过渡到了吃量狂魔的MMO、MOBA等大型网游之中。
9000 0
|
Java 中间件 网络架构
分布式协调服务中间件ZooKeeper 入门(1)-ZK的介绍与特性
一、Zookeeper简介 Zookeeper是一个服务,是一个分布式协调技术,他提供高性能,分布式的协调服务。主要用来解决分布式环境当中多个进程之间的同步控制,让他们有序的去访问某种临界资源,防止造成“脏数据”的后果。
3334 88
官宣!我们和中国电信牵手了
近日,中国电信集团公司(以下简称“中国电信”)与阿里云正式签署合作协议,联合研发“天翼钉”。
1360 0
官宣!我们和中国电信牵手了
|
弹性计算 固态存储 数据可视化
阿里云服务器ECS不同规格收费价格表(计算/通用/共享/GPU)
阿里云服务器ECS有多种实例规格,如ECS计算型c5、计算型c6、通用型g7、大数据型、SSD型、GPU型、突发性能型、共享型等,云服务器ECS实例规格不同价格不同,阿小云来详细说下不同ECS实例规格云服务器收费价格表
1886 0
|
开发者 Java CDN
阿里高级技术专家方法论:如何写复杂业务代码? | 开发者必读(042期)
最炫的技术新知、最热门的大咖公开课、最有趣的开发者活动、最实用的工具干货,就在《开发者必读》!
2131 0