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分片模式 将一个数据存储到一组水平分区或碎片.存储和访问大量数据时,这个模式可以提高可扩展性. 背景和问题 由一个单一的服务器托管的数据存储区可能会受到以下 ...
随机推荐
- 第13章—数据库连接池(Druid)
spring boot 系列学习记录:http://www.cnblogs.com/jinxiaohang/p/8111057.html 码云源码地址:https://gitee.com/jinxia ...
- windows 系统如何安装 mysql 8.0.15 数据库?
windows 系统如何安装 mysql 8.0.15 数据库? 1. 下载安装包 下载地址:https://cdn.mysql.com//Downloads/MySQL-8.0/mysql-8.0. ...
- action接收请求参数
一.采用基本类型接收请求参数(get/post)在Action类中定义与请求参数同名的属性,struts2便能接收自动接收请求参数并赋给同名属性. action的代码: public class Pa ...
- I2C通信
项目之前研究了I2C通信协议的实现,完成FPGA对视频解码芯片SAA7111A的初始化配置,设计实现了I2C主机对从机(SAA7111A)32个寄存器的写操作,因此只简单实现了I2C的写时序. 这次重 ...
- Maven项目settings.xml的配置
原文地址 http://www.cnblogs.com/DreamDrive/p/5571916.html 在Maven中提供了一个settings.xml文件来定义Maven的全局环境信息.这个文件 ...
- Python:笔记(4)——高级特性
Python:笔记(4)——高级特性 切片 取一个list或tuple的部分元素是非常常见的操作.Python提供了切片操作符,来完成部分元素的选取 除了上例简单的下标范围取元素外,Python还支持 ...
- PHP HTML DOM 解析器 中文手册
简单的PHP HTML DOM 解析器 中文手册 | PHP Simple HTML DOM Parser中文手册 目录 快速入门 如何创建HTML DOM 对象? 如何查找HTML元素? 如何访问H ...
- PL/SQL编程—游标
一.游标的相关概念: 定义: 游标它是一个服务器端的存储区,这个区域提供给用户使用,在这个区域里 存储的是用户通过一个查询语句得到的结果集,用户通过控制这个游标区域当中 的指针 来提取游标中的数据,然 ...
- python selenium firefox使用
演示的版本信息如下: Python 3.6.0 Selenium 3.5.0 Firefox 55.0.3 geckodriver v1.0.18.0 win64 1.前提准备 1.1 安装pyth ...
- JavaScript与Java数据类型的区别
今天开始正式认真学习js,虽然在平常j2ee开发中也经常用到JS但并不精通,这次随笔记下js与Java数据类型的不同之处 Number 与java不同,js作为弱类型语言即使在浮点数与整数上也未作明确 ...