C++(二十一) — 引用概念及本质
1、引用概念
引用是别名,必须在声明的时候初始化。即:是指一个已定义变量的别名。(一个内存空间,有两个名字都可以操作)
引用:在函数调用时,是变量的别名,不可以单独存在,使用时必须要初始化;
指针:本身有自己的地址,可以单独存在。
2、引用基本举例
引用在交换时的例子:
void myswap01(int a, int b)
{
int c = ;
c = a;
a = b;
b = c;
} void myswap02(int *a, int *b)
{
int c = ;
c = *a;
*a = *b;
*b = c;
} // 引用,变量的别名,指代同一个存储空间
void myswap03(int &a, int &b)
{
int c = ;
c = a;
a = b;
b = c;
} void main()
{
int x = , y = ; myswap01(x, y);
cout << "x= " << x << " y= " << y << endl; myswap02(&x, &y);
cout << "x= " << x << " y= " << y << endl; myswap03(x, y);
cout << "x= " << x <<" y= " << y << endl; system("pause");
}
3、引用本质思考
(1)引用就是别名,指向同一块内存空间。
(2)引用占用字节:int &a,,占用4个字节,就相当于一个指针所占的内存;引用有自己的存储空间,保存地址;
struct teacher
{
int age; //
char & a;//4,,相当于一个指针,占用4个字节
double &b;//
}; void main()
{
cout << sizeof(teacher) << endl;//
system("pause");
}
(3)本质:引用在C++中的内部实现:一个常量指针,所以引用所占内存大小和指针相同;
int& age ——> int* const age
相当于:编译器帮我们取了一个实参地址。
4、引用作为函数返回值
1、函数返回值为引用时,内存空间是必须要存在的(静态变量、全局变量),如果返回的是栈变量(局部变量),会出错,因为局部变量在函数返回时,地址就销毁了,比如下面的错误例子:
int& get2()
{
int a;
a = ;
return a;
}
如果返回的引用值,是静态变量或全局变量,则可以。
关键:看返回的内存空间是不是有效的内存空间。
2、引用作为左值,关键:看返回的内存空间是不是有效的内存空间。
// 返回的是一个值
int get1()
{
int a;
a = ;
return a;
} // 返回的是变量本身
int& get2()
{
static int a =;
a++;
cout << "a:" << a << endl;
return a;
} void main()
{
get2() = ; //
get2(); // system("pause");
}
5、常量引用
int x = ;
// 常量引用,变量只有只读属性,不能通过 y 去改变 x 的值
// 必须要初始化
const int &y = x; // int &m = 11;// 11没有内存地址,所以错误,
const int &z = ; // 此时常量引用可以,编译器分配了内存空间给 Z,保存值:12
C++(二十一) — 引用概念及本质的更多相关文章
- WCF技术剖析之二十一:WCF基本异常处理模式[中篇]
原文:WCF技术剖析之二十一:WCF基本异常处理模式[中篇] 通过WCF基本的异常处理模式[上篇], 我们知道了:在默认的情况下,服务端在执行某个服务操作时抛出的异常(在这里指非FaultExcept ...
- 转:二十一、详细解析Java中抽象类和接口的区别
转:二十一.详细解析Java中抽象类和接口的区别 http://blog.csdn.net/liujun13579/article/details/7737670 在Java语言中, abstract ...
- 中介者模式 调停者 Mediator 行为型 设计模式(二十一)
中介者模式(Mediator) 调度.调停 意图 用一个中介对象(中介者)来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散 而且可以独立地改变它们之间的交互. ...
- 二十一世纪计算 | John Hopcroft:AI革命
编者按:信息革命的浪潮浩浩汤汤,越来越多的人将注意力转向人工智能,想探索它对人类生产生活所产生的可能影响.人工智能的下一步发展将主要来自深度学习,在这个领域中,更多令人兴奋的话题在等待我们探讨:神经网 ...
- Citrix 服务器虚拟化之二十一 桌面虚拟化之部署Provisioning Services
Citrix 服务器虚拟化之二十一 桌面虚拟化之部署Provisioning Services Provisioning Services 是Citrix 出品的一系列虚拟化产品中最核心的一个组件, ...
- JAVA之旅(二十一)——泛型的概述以及使用,泛型类,泛型方法,静态泛型方法,泛型接口,泛型限定,通配符
JAVA之旅(二十一)--泛型的概述以及使用,泛型类,泛型方法,静态泛型方法,泛型接口,泛型限定,通配符 不知不觉JAVA之旅已经写到21篇了,不得不感叹当初自己坚持要重学一遍JAVA的信念,中途也算 ...
- JVM 内部原理(二)— 基本概念之字节码
JVM 内部原理(二)- 基本概念之字节码 介绍 版本:Java SE 7 每位使用 Java 的程序员都知道 Java 字节码在 Java 运行时(JRE - Java Runtime Enviro ...
- (C/C++学习笔记) 二十一. 异常处理
二十一. 异常处理 ● 异常的概念 程序的错误通常包括:语法错误.逻辑错误.运行异常. 语法错误指书写的程序语句不合乎编译器的语法规则,这种错误在编译.连接时由编译器指出. 逻辑错误是指程序能顺利运行 ...
- 云计算设计模式(二十一)——Sharding分片模式
云计算设计模式(二十一)——Sharding分片模式 将一个数据存储到一组水平分区或碎片.存储和访问大量数据时,这个模式可以提高可扩展性. 背景和问题 由一个单一的服务器托管的数据存储区可能会受到以下 ...
随机推荐
- 模块化之SeaJS(一)
模块化(之SeaJS) 刚接触的童鞋可能会有很多疑惑,比喻:什么是模块?模块的目的是干嘛呀?怎么样实现模块化呢? 不要急,博主正是带着这三个问题来写这篇文章的. 一,什么是模块化? 在前端开发领域,一 ...
- T-SQL with关键字 with as 递归循环表
)SET @OrgId = N'901205CA-6C22-4EE7-AE4B-96CC7165D07F'; WITH Childs AS ( SELECT * FROM HROrgRelation ...
- ArcGIS runtime sdk for wpf 授权
这两天由于runtime sdk for wpf的授权和runtime sdk 其他产品的授权的不一样导致自己混乱不堪. 总结下吧. sdk 简介 当前ArcGIS runtime sdk 包括一系列 ...
- sql中in和exists的区别
in 和exists in是把外表和内表作hash 连接,而exists 是对外表作loop 循环,每次loop 循环再对内表进行查询. 一直以来认为exists 比in 效率高的说法是不准确的.如果 ...
- 【我的Android进阶之旅】解决错误:No enum constant com.android.build.gradle.OptionalCompilationStep.FULL_APK
今天在分支编译代码并允许之后,接着同步主干代码之后,再继续点击[Run]按钮允许程序的时候报错了,错误描述日志如下所示: 一.错误描述 Error:(1, 1) A problem occurred ...
- java输出pdf
package snake; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; ...
- ionic真机调试Android报错 - could not read ok from ADB Server * failed to start daemon * error: cannot connect to daemon
在使用真机调试Android程序时,报错如下: could not read ok from ADB Server * failed to start daemon error: cannot con ...
- mybatis参数处理 $#
- jsp页面向后台传递 不赋值 传递的默认值
<input type="hidden" name="leaderIdentity" value="${subject.leaderId }&q ...
- PAT 天梯赛 L1-048. 矩阵A乘以B 【数学】
题目链接 https://www.patest.cn/contests/gplt/L1-048 题意 给出两个矩阵,先判断两个矩阵能不能相乘,如果可以,就输出相乘 结果,如果不行 则按格式输出erro ...