• 引用是给一个变量起别名
    回顾下变量,它有这两个属性:名称和空间。而引用不是变量,它仅仅只是变量的别名,没有自己的独立空间,需要与它所引用的变量共享空间,所以对于引用所做的改变实际上是对它所引用的变量的改变。
  • 定义引用的一般格式:

    下面用程序来说明下:

    编译:

    由上面的输出结果可以得出结论:定义引用时一定要初始化,指明该引用变量是谁的别名。
    所以修改程序如下:

    这时编译就正常了,下面给它进行赋值:

    编译运行:



    这如何来解释呢?“引用一经初始化,就不能重新再指向其它变量了”,所以:

  • 在实际应用中,引用一般用作参数传递与返回值【关于这点,在后面一点进行说明】

下面用程序来验证一下:

思考一下,为什么C++不允许非const引用指向const变量呢?原因很简单,如果允许的话,那可以这样写:

下面如果是这种情况呢?

实际上是跟上一步的相反,那这能编译通过么?

也就是常量引用能指向变量,那能通过引用来更改变量的值么?

这个也很容易理解,只要是常量都不能进行更改。

下面来输出一下值:

可以看出,ref4精度确实丢失了,而我们知道引用是跟变量共享空间的,那应该值也是一样的呀,这个结果不相违背了么,实际上并没有违背,原因如下:

说了这么多跟const引用相关的知识点,其实最常用的也就是它不能再赋值。

在c语言中形参传递分为值传递和指针传递,前者是形参不能更改实参,而后者是能做到形参更改实参的,而这个引用传递也能做到更改实参,下面来介绍下它:

下面用一个两数交换的例子来说明下引用作为形参的写法:

#include <iostream>
using namespace std;
void swap(int &x, int &y);
int main(){
int a, b;
a = ;
b = ;
swap(a, b);
cout<<"a="<<a<<"b="<<b<<endl;
return ;
}
void swap(int &x, int &y){
int temp;
temp = x;
x = y;
y = temp;
}

程序运行结果如下:

而其中引用的初始化是在参数调用中进行的:

而能实现数值交换的根本原来是由于引用共享变量的空间,对引用的更改也就是对变量的更改。

  • 引用的另一个作用是用于返回引用的函数。
  • 函数返回引用的一个主要目的是可以将函数放在赋值运算符的左边。
    下面用程序来实验一下:

    程序输出:

    这个输出结果也是由于引用的作用,该引用是在函数返回的时候进行初始化,而index(3)在函数返回的时候将其引用初始化了a[3],所以对index(3)做的改变实际上也就是对a[3]做的改变,所以就这是为什么是这个结果的原因。

【注意】:不能返回对局部变量的引用,下面也用程序进行说明:

编译运行:

乍看好像很正常,但是:

这时再来看结果:

这是为什么呢?

这是因为:

  • 引用访问一个变量是直接访问,而指针是间接访问。
  • 引用是一个变量的别名,本身不单独分配自己的内存空间,而指针有自己的内存空间。
  • 引用一经初始化不能再引用其它变量,而指针可以。
  • 尽可能使用引用,不得已时使用指针。
    这是由于:
    值传递:实参要初始化形参数需要分配空间,将实参内容拷贝到形参。
    引用传递:实参初始化形参数时不分配空间。
    指针传递:本质是传递,实参初始化形参的时候,也是要分配空间的,分配的是4字节的空间(32位系统),如果我们要修改指针的地址,单纯用指针传递也是不行的,需要用指针的指针(**)或引用指针(*&)。

从c到c++<三>的更多相关文章

  1. 常用 Gulp 插件汇总 —— 基于 Gulp 的前端集成解决方案(三)

    前两篇文章讨论了 Gulp 的安装部署及基本概念,借助于 Gulp 强大的 插件生态 可以完成很多常见的和不常见的任务.本文主要汇总常用的 Gulp 插件及其基本使用,需要读者对 Gulp 有一个基本 ...

  2. 【原】FMDB源码阅读(三)

    [原]FMDB源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 FMDB比较优秀的地方就在于对多线程的处理.所以这一篇主要是研究FMDB的多线程处理的实现.而 ...

  3. Jquery的点击事件,三句代码完成全选事件

    先来看一下Js和Jquery的点击事件 举两个简单的例子 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN&q ...

  4. node.js学习(三)简单的node程序&&模块简单使用&&commonJS规范&&深入理解模块原理

    一.一个简单的node程序 1.新建一个txt文件 2.修改后缀 修改之后会弹出这个,点击"是" 3.运行test.js 源文件 使用node.js运行之后的. 如果该路径下没有该 ...

  5. 简谈百度坐标反转至WGS84的三种思路

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 基于百度地图进行数据展示是目前项目中常见场景,但是因为百度地图 ...

  6. 一起学 Java(三) 集合框架、数据结构、泛型

    一.Java 集合框架 集合框架是一个用来代表和操纵集合的统一架构.所有的集合框架都包含如下内容: 接口:是代表集合的抽象数据类型.接口允许集合独立操纵其代表的细节.在面向对象的语言,接口通常形成一个 ...

  7. 谈谈一些有趣的CSS题目(三)-- 层叠顺序与堆栈上下文知多少

    开本系列,讨论一些有趣的 CSS 题目,抛开实用性而言,一些题目为了拓宽一下解决问题的思路,此外,涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题中有你感觉 ...

  8. 如何一步一步用DDD设计一个电商网站(三)—— 初涉核心域

    一.前言 结合我们本次系列的第一篇博文中提到的上下文映射图(传送门:如何一步一步用DDD设计一个电商网站(一)—— 先理解核心概念),得知我们这个电商网站的核心域就是销售子域.因为电子商务是以信息网络 ...

  9. 测试一下StringBuffer和StringBuilder及字面常量拼接三种字符串的效率

    之前一篇里写过字符串常用类的三种方式<java中的字符串相关知识整理>,只不过这个只是分析并不知道他们之间会有多大的区别,或者所谓的StringBuffer能提升多少拼接效率呢?为此写个简 ...

  10. 从0开始搭建SQL Server AlwaysOn 第三篇(配置AlwaysOn)

    从0开始搭建SQL Server AlwaysOn 第三篇(配置AlwaysOn) 第一篇http://www.cnblogs.com/lyhabc/p/4678330.html第二篇http://w ...

随机推荐

  1. Mac下用apache搭建一个局域网服务器

    一:由于MacOX系统下自带Apache环境,所以我们在Mac系统下用Apache配置. Mac系统:10.14.4 二:启动Apache 启动 在终端输入:sudo apachectl start验 ...

  2. [转帖]如何保护你的 Python 代码 (一)—— 现有加密方案

    如何保护你的 Python 代码 (一)—— 现有加密方案 Prodesire Python猫 1周前

  3. SQLServer 查询view中是否包含某个关键字

    在数据库view的创建中,会遇到一些跨数据库的view脚本,但是在将view更新到production的时候可能忘记更改database name,导致出现一些问题. 以下脚本可以检查出包含某个关键字 ...

  4. 《Mysql - 事务 MVCC》

    一:前言 - 前面通过 <Mysql 事务 - 隔离> 的学习,知道了事务的实现,是根据 获取一致性视图 来实现的. 二:那么,什么时候会获取到一致性视图呢? - 例如:有三个事务,启动的 ...

  5. 数据库相关概念讲解(java)

    1.常用类或接口介绍 1.DataSource接口 通过javaAPI中javax.sql.DataSource接口注释了解. 1.DataSource功能 如下图: 翻译: DataSource对象 ...

  6. c++语法笔记(中)

    继承与派生 继承面向对象程序设计4个主要特征:抽象,封装,继承,多态性c++通过继承实现可重用性.有时两个类的内容基本相同或有一部分相同,这时可以利用原来声明的类作为基础,再加上新的内容即可,减少了工 ...

  7. Python class and object

    # Python继承 class Person(object): """人""" def __init__(self, name, age) ...

  8. PAT(B) 1006 换个格式输出整数(Java)

    题目链接:1006 换个格式输出整数 (15 point(s)) 代码 /** * Score 15 * Run Time 153ms * @author wowpH * @version 1.1 * ...

  9. vue中设置全局的css样式

    只需在main.js    ====import './style.less'   main.js =>>   import Vue from 'vue' import App from ...

  10. (转)从0移植uboot (一) _配置分析

    ref : https://www.cnblogs.com/xiaojiang1025/p/6106431.html 本人建议的uboot学习路线,先分析原有配置,根据现有的配置修改.增加有关的部分, ...