(搬家文) c++引用深入探讨

(偶然翻起自己的旧博,忽然发现大三的时候写的这篇文章,仔细看看觉得写的还是那么回事,所以赶紧搭救出来)

引用的声明:   基本格式:引用类型 &引用名=被引用对象 

  1. &运算符:声明运算符& 跟取地址运算符&和位异或运算符&没有任何关系
  2. extern关键字:一般情况下 引用的声明必须指定被引用对象 唯一的例外是使用extern关键字
  3. const关键字:一般情况下 被引用对象必须是有效的左值对象 但是const关键字修饰的常引用类型允许被引用对象不是左值对象

引用的使用:引用可以被当作被引用对象的别名使用,单纯的引用是无意义的,引用主要应用于四个方面:

  1. 函数参数:可修改的实参,高效的复杂对象传递方式
  2. 函数返回值:不产生复制的返回值,返回左值类型的函数
  3. 运算符重载:为++ -- << >>等运算符提供了更贴近原意的重载方式
  4. 多态:代替指针使用,实现抽象类的引用

 引用的深入探讨:现在开始进入正题

    1.引用占内存空间吗?

        如果引用只是一个别名的话 他不应该占有内存空间 我用下面这段代码来查看

 

ExpandedBlockStart.gif代码
#include <iostream>
using namespace std;
void fa(){
    
int a[4];    
    cout
<<a<<endl;
}
void fb(){
    
int a[4];
    
int &b=a[0];
    cout
<<a<<endl;
    fa();
}
void fc(){
    
int a[4];
    cout
<<a<<endl;
    fb();
}
int main()
{
    fc();
    getchar();
    
return 0;
}

 

 

这段代码里 我用了三个嵌套的函数调用 这样 fa 和fc的栈段就把fb夹在了中间 fb的栈段大小变化的话 会导致fc中a的地址偏移 但是并不是每个分配都会导致栈段增大的 所以应该先测试一下 确定a的合适大小 使得一旦声明变量 b的栈段就增大。

int &b=a[0];注释掉的话 可以看到fc中输出的地址变了 fb没有变 那么 引用b显然占据了内存空间 我的代码在g++中编译,结果也是g++的结果。

2.引用的值不可改变吗?

一个已经初始化的引用类型对象 其引用的对象不可能被合法的改变。

前面一段代码展示给我们 引用确实占据了内存空间 ,了进一步了解其本质,我们必须获得它的地址。&取地址操作符显然是无法做到的 几乎每个学c++的人都会尝试用这种办法去取引用类型的地址,但得到的都是被引用对象的地址。

还从前面的例子入手 fb中 a的地址没有改变  fa中a的地址改变 那么 int &b的分配应该在 二者之间 于是 最可能的位置就是a中的a[4]   但输出之后我发现a[4]不是,因为数组a是跟栈逆向分配的 之后我试了这样的代码
void fb(){
    int a[4];
    int b=20;
    cout<<a[-1]<<endl;
    fa();
}

 在我的编译器中 b跟a[-1]总是相等 于是 我把int b 替换成int &b=a[0]; ok 我发现它指向了一个貌似地址的东西。改变b的指向 发现a[-1]是随之变化的 现在 我几乎可以确定 a[-1]就是b了 再用一段这样的代码来检验
void fb(){
    int a[4]={1,2,3,4};
    int &b=a[0];
    a[-1]+=4;
    cout<<b<<","<<a[0]<<endl;
    fa();
}

引用真的是不可改变的吗? 在这个例子中 我使b指向了a[1] 而不再是a[0]

3.引用和指针
从上面的例子看出 引用的内部实现和指针并无两样。如果参考其他语言的思想的话 可以得到结论:引用就是指针常量。 在c++中 引用在语法上与指针有着明显的差异 但是 他们并没有本质不同 引用是c++中实现的一种限制比较严格的常量指针 它在参与任何运算之前自动解引用。

在使用中 推荐尽量用引用代替指针,因为引用是一种比指针更安全的类型 并且有更清晰的语义(当然指针也有适合的语义)

4.其他语言
顺便一提,在C家的其他语言中 引用几乎被作为访问对象的唯一手段

C++:有指针 所有运算符会解引用 所有对象不作为引用 传递参数和返回值时如果不希望复制 则必须将形参指定为引用类型
C#: unsafe模式有指针 除了=之外的操作符会解引用 所有对象作为引用 传递参数和返回值时如果希望复制 则必须显式clone
Java:无指针 除了=之外的操作符会解引用 类似c#
javascript:无指针但是可以变通 除了=之外的操作符会解引用 没有提供复制传递的方法(郁闷)

转载于:https://www.cnblogs.com/winter-cn/archive/2010/07/15/1777668.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/410976.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

参数作用域实践

auto参数&#xff0c;申明时可以忽略auto void fun(){int p 1;cout<<"p:"<<p<<endl;for(int i0;i<5;i){int p 10;cout<<"p:"<<p<<endl;}// 此处输出的还是外围作用域定义的p值1cout<<"p:"<<…

工作395-路由选择

初始化 新页面入栈 打开新页面 新页面入栈 页面重定向 当前页面出栈&#xff0c;新页面入栈 页面返回 页面不断出栈&#xff0c;直到目标返回页 Tab 切换 页面全部出栈&#xff0c;只留下新的 Tab 页面 重加载 页面全部出栈&#xff0c;只留下新的页面

phpstudy2018修改php版本,phpstudy的php版本自由修改的方法

作为PHP开发的常用工具&#xff0c;phpstudy具有许多强大的功能&#xff0c;它可以连接到MySQL并检查服务器状态&#xff0c;感兴趣的话就随爱站技术频道小编一起来了解phpstudy的php版本自由修改的方法吧&#xff01;网上有着许多的网站集成搭建软件&#xff0c;比较出名的就有…

Sql字符串函数(1)

--1.截取已知长度的函数 Select S1http://www.163.com-- A.截取从字符串左边开始N个字符 Declare S1 varchar(100) 显示结果: http Select Left(S1,4) Select S1http://www.163.com -- B.截取从字符串右边开始N个字符(例如取字符http://www.163.com/) Declare S1 varchar(100) …

工作397-Wxml

WXMLWXML&#xff08;WeiXin Markup Language&#xff09;是框架设计的一套标签语言&#xff0c;结合基础组件、事件系统&#xff0c;可以构建出页面的结构。要完整了解 WXML 语法&#xff0c;请参考WXML 语法参考。用以下一些简单的例子来看看 WXML 具有什么能力&#xff1a; …

php格式的种子,php读取torrent种子文件内容的方法(测试可用)

本文实例讲述了php读取torrent种子文件内容的方法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;/*** Class xBEncoder* Author: Angus.Fenying* Version: 0.1* Date: 2014-06-03** This class helps stringify or parse BENC* codes.** All Copyrights 2007 - 2014 …

API网关从入门到放弃

前言 假设你正在开发一个电商网站&#xff0c;那么这里会涉及到很多后端的微服务&#xff0c;比如会员、商品、推荐服务等等。 那么这里就会遇到一个问题&#xff0c;APP/Browser怎么去访问这些后端的服务? 如果业务比较简单的话&#xff0c;可以给每个业务都分配一个独立的域…

BarTender操作遇到OLE DB遇到了错误0x80004005”的问题

在使用BarTender打印条码时操作遇到"OLE DB遇到了错误0x80004005”的问题 在打印时关掉数据库所连接的Excel文件即可转载于:https://www.cnblogs.com/edrp/archive/2010/07/18/1780122.html

工作397-Wx

WXSSWXSS (WeiXin Style Sheets)是一套样式语言&#xff0c;用于描述 WXML 的组件样式。WXSS 用来决定 WXML 的组件应该怎么显示。为了适应广大的前端开发者&#xff0c;WXSS 具有 CSS 大部分特性。同时为了更适合开发微信小程序&#xff0c;WXSS 对 CSS 进行了扩充以及修改。与…

震惊!垃圾分类居然能用Python搞定!

目录 0 引言 1 环境 2 需求分析 3 代码实现 4 后记 0 引言 纸巾再湿也是干垃圾&#xff1f;瓜子皮再干也是湿垃圾&#xff1f;&#xff1f;最近大家都被垃圾分类折磨的不行&#xff0c;傻傻的你是否拎得清&#xff1f;???自2019.07.01开始&#xff0c;上海已率先实施垃圾分类…

java中 try用法,Java里try catch的简单用法

优质回答 回答者&#xff1a;temps1991Java里try catch的简单用法&#xff1a;1、trycatch程序的流程是&#xff1a;运行到try块中&#xff0c;如果有异常抛出&#xff0c;则转到catch块去处理。然后执行catch块后面的语句扩展部分&#xff1a;1、trycatchfinally程序的流程是&…

免费试用 Mobile Me

曾经尝试着注册过Mobile me&#xff0c;发现居然试用也要提供信用卡&#xff0c;而且地区选项里根本就没有中国&#xff0c;故愤然弃之。 今天忽然想再尝试一把&#xff0c;毕竟把mac、iphone&#xff0c;和即将到来的ipad连在一起是挺有意思的事情。 打开http://www.apple.com…

php call()函数,PHP中__call()方法详解

前面给大家介绍了《__construct()&#xff0c;类的构造函数》《__destruct()&#xff0c;类的析构函数》&#xff0c;下面继续给大家介绍PHP中__call()方法。__call()&#xff0c;在对象中调用一个不可访问方法时调用。该方法有两个参数&#xff0c;第一个参数 $function_name …

工作398-关于e.currentTarget.dataset的取值。

wxjs代码&#xff1a;GetAction: function (e) {var action e.currentTarget.dataset.action;console.log(action); //father}wxml代码&#xff1a;<view data-action"father" bindtap"GetAction"><image src"https://ss0.baidu.com/6ONWsj…

Postman: Test

Tests 参考&#xff1a;Writing Tests Testing examples 这里写测试用例&#xff0c;进行一些判断等等。即处理断言 下面新建了两个测试用例&#xff0c;名字分别是”Status code is 200“ 、”Status code name has string“。 “responseCode.code 200” 返回 True 或者 Fal…

nginx php怎么配置伪静态,nginx rewrite 伪静态配置参数和使用例子

正则表达式匹配&#xff0c;其中&#xff1a;* ~ 为区分大小写匹配* ~* 为不区分大小写匹配* !~和!~*分别为区分大小写不匹配及不区分大小写不匹配文件及目录匹配&#xff0c;其中&#xff1a;* -f和!-f用来判断是否存在文件* -d和!-d用来判断是否存在目录* -e和!-e用来判断是否…

工作399-openType=“getUserInfo“ lang=“zh_CN“ bindgetuserinfo=“getUserInfo“

获取用户信息组件介绍组件变化&#xff1a;open-type 属性增加 getUserInfo &#xff1a;用户点击时候会触发 bindgetuserinfo 事件。新增事件 bindgetuserinfo &#xff1a;当 open-type 为 getUserInfo 时&#xff0c;用户点击会触发。可以从事件返回参数的detail字段中获取到…

比IETEST更好用的浏览器兼容性测试软件[绿色]

Xenocode Browser Sandbox 改变了基于 Windows 的浏览器兼容测试工具的游戏规则&#xff0c;只需点一下鼠标&#xff0c;就会直接打开一堆各式各样的浏览器窗口&#xff0c;你可以在不同版本的 IE, Firefox, Google Chrome, Safari 进行测试。是真正的测试&#xff0c;不是屏幕…

oracle函数 sysdate

【功能】&#xff1a;返回当前日期。 【参数】&#xff1a;没有参数&#xff0c;没有括号 【返回】&#xff1a;日期 【示例】select sysdate hz from dual; 返回&#xff1a;2008-11-5转载于:https://www.cnblogs.com/fanweisheng/p/11119836.html

php守护进程热更新,服务器编程--守护进程

守护(Daemon)进程又叫作“精灵进程”&#xff0c;虽然守护进程这个名字更为常用&#xff0c;但是个人感觉还是精灵进程较为机灵可爱些。服务器进程一般都是守护进程&#xff0c;这类进程的一个显著特点就是无交互地在后台进程。注意&#xff1a;这里所说的无交互并不是说真的不…