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分片模式 将一个数据存储到一组水平分区或碎片.存储和访问大量数据时,这个模式可以提高可扩展性. 背景和问题 由一个单一的服务器托管的数据存储区可能会受到以下 ...
随机推荐
- CSRF Cross-site request forgery
w 跨站请求伪造目标站---无知用户---恶意站 http://fallensnow-jack.blogspot.com/2011/08/webgoat-csrf.html https://wiki. ...
- Casperjs中fill提交表单遇到的问题
1.if you access internet with proxy please add --ignore-ssl-errors=true --ssl-protocol=a ...
- List 接口常用子类及其特点
List 常用子类: - Vector: 内部是数组数据结构,是同步的. 增删, 查询都很慢 - ArrayList: 内部是数组数据结构,是不同步的,替代了 Vector,不同步的效率较高. 特点: ...
- Android图片加载框架Picasso最全使用教程5
在之前的四篇博客中,我们学习了所有的关于Picasso的主要方法,我们也对这个Picasso有了一个很深的认识,下面就主要对Picasso自身进行分析,这样的话,会让我们更了解Picasso的核心方法 ...
- python删除目录下七天前创建的文件
#coding=utf-8 import os import time import datetime def deleteOutdateFiles(path): """ ...
- Hadoop源码如何查看
如何查看hadoop源码 1解压hadoop安装压缩文件成为文件夹,再进入解压后的文件夹下的src文件夹,选中core,hdfs,mapred三个文件夹
- Part01、memcache 缓存
Python操作 RabbitMQ.Redis.Memcache.SQLAlchemy 目录 一. Memcached Memcached安装和基本使用 Python操作Memcached2.1 se ...
- django-ORM复习补充
建表 class Author(models.Model): name = models.CharField(max_length=32) age = models.IntegerField() # ...
- JDK1.7配置及测试
Windows 7 配置jdk 1.7环境变量 (网上找的,写的很清晰,保存下) 环境:win7(32位) jdk1.7 1.右击计算机-属性-高级系统设置-高级-环境变量,弹出“环境变量” ...
- seven habits of highly effective people 高效能人士的七个习惯
习惯的模型 : dependent 依赖 -- independent 独立自主 --interdependent 互相依赖 1: be proactive 主动积极 what you can ...