当前位置: 首页 > wzjs >正文

建设厅网站首页重庆承越网站建设地址

建设厅网站首页,重庆承越网站建设地址,友博国际个人中心登录,全球影响力最大的人​ 🥁作者: 华丞臧 📕​​​​专栏:【C】 博主Gitee 各位读者老爷如果觉得博主写的不错,请诸位多多支持(点赞收藏关注)。如果有错误的地方,欢迎>在评论区指出。 推荐一款刷题网站 👉LeetCode…

🥁作者: 华丞臧
📕​​​​专栏:【C++】
博主Gitee
各位读者老爷如果觉得博主写的不错,请诸位多多支持(点赞+收藏+关注)。如果有错误的地方,欢迎>在评论区指出。
推荐一款刷题网站 👉LeetCode


文章目录

  • 一、引用概念
  • 二、引用特性
  • 三、常引用
  • 四、使用场景
    • 4.1 做参数
    • 4.2 做返回值
  • 五、引用和指针的区别


一、引用概念

引用不是新定义一个变量,而是给已经存在的变量取了一个别名,编译器不会为引用变量开辟内存空间,它们引用的变量共用同一块空间

//类型& 引用变量名 = 引用实体;
如下:
int a = 10;
int& ra = a; //定义引用类型,必须初始化

二、引用特性

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

在这里插入图片描述
可以看到a,ra,rra三个变量地址一致,从这里可以看出引用其实就是变量实体的别名,与实体共用同一块空间。

三、常引用

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 做参数

在C语言当中,调用一个函数传参分为两种:一是传值二是传地址,在这两种方式中只有传地址才能通过函数中的形参改变实参;而现在C++当中使用引用做形参同样能达到相同的效果。

//这是一个例子
void Swap(int& left, int& right)
{int temp = left;left = right;right = temp;
}

引用做参数的优点

  1. 减少拷贝,提高效率
  2. 输出型参数,函数中修改形参实参也修改了

关于函数重载

int Add(int& a, int& b)
{int c = a + b;return c;
}int Add(int a, int b)
{int c = a + b;return c;
}

上述函数构不构成重载看编译器的识别或者名字修饰规则,但是不能这么写程序会出错,因为调用时存在二义性,编译器识别不出。
传值、传引用效率比较

#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 < 100000; ++i)TestFunc1(a);size_t end1 = clock();// 以引用作为函数参数size_t begin2 = clock();for (size_t i = 0; i < 100000; ++i)TestFunc2(a);size_t end2 = clock();// 分别计算两个函数运行结束后的时间cout << "TestFunc1(A)-time:" << end1 - begin1 << endl;cout << "TestFunc2(A&)-time:" << end2 - begin2 << endl;
}int main()
{TestRefAndValue();return 0;
}

在这里插入图片描述
可以看到,数据量很大的时候引用做参数的效率更快

4.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;//cout << "Add(1, 2) is :"<< ret <<endl;  //再打印一次会是什么结果?return 0;
}

打印一次
在这里插入图片描述
打印两次
在这里插入图片描述
说明

  • 打印一次的时候,add函数栈帧销毁时函数栈帧中存放c变量的空间并没有被销毁改变,此时去访问这块空间的值还是7。
  • 当第二次打印两次的时候,我们第二次非法访问同样一块空间发现值已经被改变,这是因为先取值再打印所以第一次还是7但是此时cout函数调用开辟了栈帧覆盖了那片空间,从而导致了值的改变。
  • 上述的那一段程序是错误,属于非法访问,这说明:出了函数作用域变量就不存在了是不能使用传引用返回的

引用返回的优点

  1. 减少拷贝,提高效率
  2. 修改返回值

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

#include<iostream>
#include <time.h>using namespace std;struct A 
{ int a[10000]; 
};
A a;
// 传值返回
A TestFunc1() 
{ return a; 
}
// 引用返回
A& TestFunc2() 
{ return a; 
}void TestReturnByRefOrValue()
{// 以值作为函数的返回值类型size_t begin1 = clock();for (size_t i = 0; i < 100000; ++i)TestFunc1();size_t end1 = clock();// 以引用作为函数的返回值类型size_t begin2 = clock();for (size_t i = 0; i < 100000; ++i)TestFunc2();size_t end2 = clock();// 计算两个函数运算完成之后的时间cout << "TestFunc1 time:" << end1 - begin1 << endl;cout << "TestFunc2 time:" << end2 - begin2 << endl;
}int main()
{TestReturnByRefOrValue();return 0;
}

在这里插入图片描述
通过上述代码的比较,发现传值和传引用在作为传参以及返回值类型上效率相差很大。

五、引用和指针的区别

语法概念上引用就是一个别名,没有独立空间,和其引用实体共用同一块空间;但在底层实现上实际是有空间的,因为引用是按照指针方式来实现的

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. 引用比指针使用起来相对更安全

文章转载自:

http://LdoKuCit.rqLbp.cn
http://NXsm3aG8.rqLbp.cn
http://i2YtpHJp.rqLbp.cn
http://rTTsJzcv.rqLbp.cn
http://cW8wBy7G.rqLbp.cn
http://BLCs8l1s.rqLbp.cn
http://WjgOQpO3.rqLbp.cn
http://StOaw7k1.rqLbp.cn
http://8ZerlJVV.rqLbp.cn
http://IHrDonZY.rqLbp.cn
http://4JHyHxoJ.rqLbp.cn
http://vjQUQPqV.rqLbp.cn
http://r807mqpV.rqLbp.cn
http://48OtjGHp.rqLbp.cn
http://zX5n8wHE.rqLbp.cn
http://TiAcGThl.rqLbp.cn
http://zm6w0JLI.rqLbp.cn
http://kkshrP6g.rqLbp.cn
http://pH377ZWJ.rqLbp.cn
http://G5PR5sDj.rqLbp.cn
http://7k8HfHlK.rqLbp.cn
http://6UrWB4U6.rqLbp.cn
http://CD824Q68.rqLbp.cn
http://W9kCqehD.rqLbp.cn
http://vLwkCLCq.rqLbp.cn
http://WnJdPvRi.rqLbp.cn
http://XolWcWlL.rqLbp.cn
http://mNzM4OJA.rqLbp.cn
http://kwjNVCXA.rqLbp.cn
http://tSP956UI.rqLbp.cn
http://www.dtcms.com/wzjs/652997.html

相关文章:

  • 自己做的网站网页错位wordpress文章页模板
  • 配件查询网站制作dz论坛网站建设
  • 网站html地图制作顺义青岛网站建设
  • 蛋糕店网站开发策划书站长工具的网址
  • 网站建设教程自学网百度首页关键词优化
  • 哪个做网站的公司好title 门户网站建设招标书
  • 中国建设银行山西省分行网站WordPress整站下载器
  • 如何给网站引流wordpress阅读数总是0
  • 厦门广告公司网站建设东莞专业做网站优化
  • 做红酒闪购的网站有哪些室内设计效果图线稿
  • 通州网站制作电子商务网站的功能
  • 陵水网站建设咨询网站效果图怎么做的
  • 有没有做会计的网站懒人图库网站源码
  • xxx网站建设策划书范文东莞定制网站建设
  • 虚拟网站新的购物网站怎么做流量分析
  • 长沙广告公司排行榜安卓优化大师旧版本下载
  • 网页设计制作一个网站网站建设计入什么会计科目
  • 潍坊门户网站建设wordpress建站教程linux
  • 自己动手的网站域名买卖网站
  • 站长工具查询网站wordpress该页无法显示
  • 中国建设招标网 官方网站下载企业网站做seo的必要性
  • 网页设计模板图片什么软件好用一个公司优化需要做多少个网站
  • 商务网站的主要内容哈尔滨优化推广公司
  • 贵阳市做网站的公司有哪些站长统计
  • 北京网站域名备案跨越网站建设科技有限公司
  • 公司网站建设怎么规划比较好产品包装设计模板
  • 建设淘宝网站的人员组织网站设计影响seo的因素
  • 做网站搭建需要什么人注册一个公司需要什么资料
  • 网站如何重新备案想学装修设计怎么入门
  • 网页游戏网站官网网站布局 下载