1.引用的本质

int b = 10;

int &a = b;

等效于:

int * const a = &b;

由于 a 是 const声明,所以一旦定义无法修改,所以要在定义时就要赋初值。

实际使用时:

a = 10;   ==> *b = 10;

2. 引用于函数结合

(1)引用做函数参数

int func(int &a)

{

...

}

使用时:

int b = 10;

func(b);

为了分析语法,将其转换为指针,编译器在实参给形参赋值时:

int &a = b;   ===>   int *const a = &b;

实际使用:

a = 10; ===> *b = 10;

所以实现了间接赋值。

(2)引用做函数返回值

int &func()
{
   ;
   return ret;
}

int main(){   int a = func();     // gcc 中,这里出现段错误   int &b = func();   cout << a << endl;      cout << b << endl;   // gcc 中,这里段错误}

在 VS 中,debug版本和 release版本的输出不同。

所以上面的代码是错误的。

分析原因:

int a = func();  ==>

int &tmp = ret;  === >  int *const tmp = &ret;

a = tmp;       ===>  a = *(&ret);

其中 tmp 是 隐藏变量,一般在寄存器中。

由于 函数返回后,局部变量 ret 空间释放,所以对无效空间的访问是未知的。

int &b = func(); ==>

int &tmp = ret;   ===> int *const tmp = &ret;

int &b = tmp;     ===> int *const b = tmp;  ==>  int *const b = &ret;

可以看出这里不存在非法地址访问,所以这句不会报错。

cout << b << endl; ===> cout << *(&ret) << endl;

这里是非法地址访问。报错

由于上面的非法地址访问的本质原因是栈空间的释放,所以如果变量的存储类在堆或数据段就不会有错。

3. 引用与指针

(1)引用指针

int &b = c;

int & * a = &b;

上面的表达式是错误的,因为 指针不能指向引用,原因是 C++之父 不希望 引用和指针一样出现多级引用,同理也没有 引用的引用。

(2)指针引用

int *b = &c;

int * & a = b;

这是成立的,相当于:

int * * const a = &b;

4. 引用与 const

(1)使用变量初始化常引用

int a = 10;

const int &b = a;

a = 11;

b = 12;  // 错误

通过常引用赋予变量只读属性。

(2)使用字面量初始化常引用

int &a = 10;    // 错误,因为字面量没有地址,无法引用

const int &b = 10;

常引用可以引用字面量,当常引用引用字面量时,C++编译器为字面量分配空间,并让常引用符号作为该空间的别名。

C++ 基础 引用的更多相关文章

  1. java基础-引用数据类型之二维数组(Array)

    java基础-引用数据类型之二维数组(Array) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 之前我们学习过了Java的一维数组,所谓的二维数组就是元素是一堆一维数组的数组,换 ...

  2. java基础-引用数据类型之一维数组(Array)

    java基础-引用数据类型之一维数组(Array) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.数组的定义 1>.为什么需要数组 保存一个数据可以定义一个变量,如果要保 ...

  3. Java基础-引用数据类型之集合(Collection)

    Java基础-引用数据类型之集合(Collection) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.为什么出现集合类 面向对象语言对事物的体现都是以对象的形式,所以为了方便 ...

  4. C++ 基础中的基础 ---- 引用

    C++ 基础中的基础 ---- 引用 引用的概念:引用变量是一个别名,也就是说,它是某个已存在变量的另一个名字.一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量.比如: int n ...

  5. Java 基础 引用数据类型 ArrayList集合

    引用数据类型(类) 分类 提到引用数据类型(类),其实我们对它并不陌生,如使用过的Scanner类.Random类. 我们可以把类的类型为两种: 第一种,Java为我们提供好的类,如Scanner类, ...

  6. Java 基础 引用数据类型 和 流程控制

    引用数据类型 与定义基本数据类型变量不同,引用数据类型的变量定义及复制有一个相对固定的步骤和格式: 数据类型 变量名 = new 数据类型(); 如:String st = new String(); ...

  7. css基础 引用方式 标签选择器 优先级 各式布局

    今天讲的css基础,了解了css即层叠式表,是美化网页,控制页面的样式. 样式表引进网页的3种方式1内联式,语法例子:<div style="width: 100px;height: ...

  8. Django基础(一):基础引用

    Web框架本质 我们可以这样理解:所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端. 这样我们就可以自己实现Web框架了. 半成品自定义web框架 impor ...

  9. LinuxC/C++基础——引用

    1.引用(Reference) 1.1引用的基本语法 引用是C++对C的重要扩充,也存在与其他一些编程语言中,并不是C++的发明.通过引用,C++增加了 另外一种给函数传递地址的途径,这就是按引用传递 ...

随机推荐

  1. html 01前沿-web介绍

    1. 认识网页 网页主要由文字.图像和超链接等元素构成.当然,除了这些元素,网页中还可以包含音频.视频以及Flash等. 2. 浏览器(显示代码) 浏览器是网页显示.运行的平台,常用的浏览器有IE.火 ...

  2. Android getRunningTasks和getRunningAppProcesses失效

    Android 5.0以上的getRunningTasks失效,该方法可以获得在前台运行的系统进程.可以用getRunningAppProcesses方法暂时替代. android6.0以上的getR ...

  3. Cg shadow of sphere

    参考自:https://en.wikibooks.org/wiki/GLSL_Programming/Unity/Soft_Shadows_of_Spheres using UnityEngine; ...

  4. Shader学习笔记整理

    1.常用矩阵 UNITY_MATRIX_V 视口矩阵 UNITY_MATRIX_P 投影矩阵 UNITY_MATRIX_MV 模型矩阵 * 视口矩阵 UNITY_MATRIX_MVP 模型矩阵 * 视 ...

  5. 浅谈SQL Server中的事务日志(一)----事务日志的物理和逻辑构架

    简介 SQL Server中的事务日志无疑是SQL Server中最重要的部分之一.因为SQL SERVER利用事务日志来确保持久性(Durability)和事务回滚(Rollback).从而还部分确 ...

  6. 易客CRM-3.0.4 (OpenLogic CentOS 6.5)

    平台: CentOS 类型: 虚拟机镜像 软件包: apache1.3.8 centos6.5 mysql5.1.72 php5.2.17 commercial crm linux 服务优惠价: 按服 ...

  7. 查看Linux网卡地址,网络地址

    查看网络地址 ip a 或ip addr show 或ifconfig,此指令在部分linux系统中不支持

  8. OpenGL学习 Our First OpenGL Program

    This shows you how to create the main window with the book’s application framework and how to render ...

  9. MySQL入门很简单: 2 MySQL数据类型

    2. MySQL数据类型 2.1 整数类型 后面的是默认显示宽度: tinyint(4) smallint(6) mediumint(9) int(11) bigint(20) 2.2 浮点型和定点数 ...

  10. WSL的unable to resolve host问题

    运行apt-get的时候提示 sudo: unable to resolve host DESKTOP-PS8VD9E 在 /etc/hosts文件中 127.0.0.1 对应主机名字给加一行就好了