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

    下面用程序来说明下:

    编译:

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

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

    编译运行:



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

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

下面用程序来验证一下:

思考一下,为什么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. Tensorflow 2.0 datasets数据加载

    导入包 import tensorflow as tf from tensorflow import keras 加载数据 tensorflow可以调用keras自带的datasets,很方便,就是有 ...

  2. 最新 腾讯java校招面试题(含整理过的面试题大全)

    从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿.腾讯等10家互联网公司的校招Offer,因为某些自身原因最终选择了腾讯.6.7月主要是做系统复习.项目复盘.LeetCode ...

  3. shell将txt转换为csv

    cat aa.txt | tr -s '[:blank:]' ',' > bb.csv

  4. 简单谈一谈Java内部类的使用原因

    使用内部类的原因 学习总得知其所以然,前面的一篇文章中我有提到过关于java内部类的几种用法以及一些示例,但是不明白内部类具体可以做什么,显然学习起来很渺茫,今天的文章简单说一说使用内部类的几个原因, ...

  5. Git强制推送代码到多个远程仓库

    git push -f origin master 注释: origin 远程仓库名, master 分支名,-f 为force,意为:强行.强制.

  6. NoSQL数据库一MongoDB基本使用

    如今的网站对数据存储要求越来越灵活,在这种需求下 NoSQL 也就是非关系数据库越来越流行.所谓非关系数据库,是指不使用 SQL 语言进行数据操作的数据库的统称.这类数据库存储数据时没有固定的模式,不 ...

  7. 序列变换(HDU-5256)【LIS】

    题目链接:https://vjudge.net/problem/HDU-5256 题意:给一个数列,每一个数都不相同且为整数,现求,最少需要修改多少次才能使该数列为严格上升的. 思路:首先,对于一个严 ...

  8. Robot 安装

    安装一个测试环境的 下载python27 升级pip E:\Python27\python -m pip install --upgrade pip 安装robotramework E:\Python ...

  9. Python 【收发邮件】

    发邮件 smtplib模块主要负责发送邮件 email模块主要负责构造邮件.这两个都是Python内置模块 smtplib.SMTP.方法 #按住Ctrl键并点击SMTP ,会看到对SMTP的解释(v ...

  10. 解决 windows oracle ORA-01113和ORA-01110错误

    windows2008上的数据库版本为11.2.0.4.0,数据库打开为mount状态.报错如下: SQL> startup ORACLE instance started. Total Sys ...