学习C++ -> 引用( References )

一、引用的介绍
    引用就是某一变量(目标)的一个别名, 相当于同一个人有了两个名字, 无论喊哪一个名字实际上都是指的同一个人。 同样, 在引用上, 对引用的操作与对变量直接操作的效果完全一样, 因此, 修改引用的值就是在修改变量的值。
    
    从内存角度来说, 引用与变量名指向的都是同一处内存, 对引用地址的操作与对变量名地址的操作都是对同一处内存进行操作。 引用本身占用存储单元, 但是你没有办法从C++层面去访问到引用所占用的空间。
    

 

    
二、引用的声明
    引用的声明方式与指针类似, 其形式如下:
        类型标识符 &引用名 = 初始值 ;
    & 为引用说明符, 表示该数据类型为引用类型。例如:

 int n =  ; int &rn = n ; //建立变量int型变量n的引用rn float f ; //建立float型变量f的引用rf float &rf = f ;

  
    在声明一个引用时必须对引用进行初始化, 因为引用一经声明便无法修改, 不能声明一个未初始化的引用。例如:

 int &rn ; //错, 未初始化

       
    其次, 声明语句中的类型必须与初始值的变量类型一致, 像下面这样使用就是错误的:

 int n =  ; double &rn = n ; //错, 声明的引用类型为double, 而初始值的类型为int

 

 
       
        
三、引用使用初步
    1>. 例: 使用引用进行值的输入与输出:
    

     #include<iostream>

     using namespace std;
int main() { int n ; int &rn = n ; //建立n的引用rn cin>>rn ; //通过引用rn对变量进行赋值
cout<<"n="<<n<<", rn="<<rn<<endl ; //输出n与rn的值 return ; }

    输出:

     ↙键盘输入 n=, rn= Process returned  (0x0)   execution time : 2.094 s Press any key to continue.

    在该程序中, 首先建立n的引用rn, 再通过引用rn对n的值进行赋值, 准确来说是通过rn对他们所指向的内存单元进行数据的写入。从输入以及输出结果来看, n与rn的值都是100, 也就再一次证明了对引用的任何操作都等价于对目标变量的操作。

    2>. 建立指针的引用
        对指针建立引用是合法的, 如:

 int n =  ; int *pn = &n ; //指向变量n的指针 int * &rpn = pn; //建立指针的引用

           
        在建立指针的引用时需要注意 * 号与 & 符号的位置问题, int * &rpn = pn; *号在前, 这样是正确的; 如果把 * 号放在 & 符号后( int & *rpn = pn; ) 这样就是错误的, 编译器会报错。
        
        
    3>. 对无名实体建立引用
        C++允许对用new开辟的无名内存建立引用, 如:

 int &r = *new int ;

        在销毁所开辟的内存时, 可以使用 delete &r; 进行实现。
        
        

 

四、引用使用的一些限制
    1>. 不能建立数组的引用
        数组是由若干个元素组成的集合, 所以无法建立一个数组的别名。 从内存角度来说, 数组名只是代表一个内存单元的地址, 而引用需要的是一个内存单元的实体, 也就是说一次最多只能对该数组中的一个元素建立引用, 如:

 int a[] = {} ; //对数组名建立引用 int &r = a ;   //错误, a不是实体 //对数组元素建立引用 int &r = a[] ; //正确//因为一次只能对一个元素进行引用

           
            
    2>. 不能建立引用的引用
        一个变量可以有多个引用, 但C++规定不能对引用再建立引用:

 int & &rr = r ; //错误, 不能建立引用的引用

 

           

            
五、指针与引用的比较
    不同点:
        1>. 指针可以被重新赋值, 而引用一经声明初始化便无法修改 ;
        2>. 指针可以为空(NULL), 而引用不能 ;
        3>. 指针在声明时可以不进行初始化, 而引用不能 ;
    相同点:
        都能直接对实体进行操作。
        
    一般来说, 引用能做到的事指针都能做到, 但指针威力较大, 在使用不当的情况下指针错误通过会造成十分严重的后果, 风险较高。而引用则相对安全, 并且引用不会使用额外的存储单元。因此正确的使用引用可以提高代码变的健壮性, 使程序更高效的运行。
   

(转) 学习C++ -> 引用( References )的更多相关文章

  1. C++学习之引用

    C++学习之引用         临时变量.引用参数和const         现在,当参数为const引用的时候,如果实参与引用参数不匹配,C++将生成临时变量.C++将在下面两种情况下生成临时变 ...

  2. jvm内存JVM学习笔记-引用(Reference)机制

    在写这篇文章之前,xxx已经写过了几篇关于改jvm内存主题的文章,想要了解的朋友可以去翻一下之前的文章 如果你还不了解JVM的基本概念和内存划分,请阅读JVM学习笔记-基础知识和JVM学习笔记-内存处 ...

  3. iOS学习——属性引用self.xx与_xx的区别

    在iOS开发过程中,我们用@proprety声明一个属性后,在代码中我们可以用self.xx与_xx来获取到这个属性.但是一直有一个疑惑,那就是这两个之间有什么区别呢?最初我一直觉得这两个之间没什么区 ...

  4. Java学习之强引用,弱引用,软引用 与 JVM

    1.java内存管理分为内存分配和内存回收,都不需要程序员负责. 2.垃圾回收的机制主要是看对象是否有引用指向该对象.  java对象的引用包括  强引用 软引用 弱引用 虚引用 3.强引用 是指创建 ...

  5. 我的c++学习(7)引用和复制构造函数

    一.引用 什么是引用? 引用又称别名(alias),是一种非常特殊的数据类型.它不是定义一个新的变量,而是给一个已经定义的变量重新起一个别名,也就是 C++系统不为引用类型变量分配内存空间.引用主要用 ...

  6. JVM学习之强引用、弱引用、软引用、虚引用

    转自:http://my.oschina.net/ydsakyclguozi/blog/404389 多谢博主分享 1.强引用(StrongReference) 强引用是使用最普遍的引用.如果一个对象 ...

  7. cocos2dx 3.0 学习笔记 引用cocostudio库 的环境配置

    cocostudio创建UI并应用时须要引用cocostudio库,须要额外的环境配置: 之前已经搭配好了基础的开发环境,包含 1) JDK 2) Python 2.7 3) ant 4) visua ...

  8. Android JNI 学习(五):References Api

    1. NewGlobalRef(创建全局引用) jobjectNewGlobalRef(JNIEnv *env, jobject obj); 创建 obj 参数所引用对象的新全局引用.obj 参数既可 ...

  9. Lambda学习---方法引用和其他基本应用

    package com.zx; import java.util.*; import java.util.function.*; import java.util.stream.Collectors; ...

随机推荐

  1. 《那些事之Log4j》什么是log4j?【专题一】

    Log4j 简介 在应用程序中添加日志记录总的来说基于三个目的: 监视代码中变量的变化情况,周期性的记录到文件中供其他应用进行统计分析工作: 跟踪代码运行时轨迹,作为日后审计的依据: 担当集成开发环境 ...

  2. JedisPool操作

    Jedis 使用 commons-pool 完成池化实现. 先做个配置文件(properties文件): #最大分配的对象数 redis.pool.maxActive=1024 #最大能够保持idel ...

  3. 函数:递归是神马 - 零基础入门学习Python022

    函数:递归是神马 让编程改变世界 Change the world by program 我们这节课的主题叫递归是神马,将通过小甲鱼带感的讲解,来告诉大家神马是递归!如果说优秀的程序员是伯乐,那么把递 ...

  4. C语言--位运算符

    一.位运算符 1.按位与:& 1> 功能 * 只有对应的两个二进制位为1时,结果位才为1,否则为0 * 举例:10用二进制表示为1010,  7用二进制表示为0111.对两个数值进行&a ...

  5. bzoj1004 Cards

    Description 小春现在很清闲,面对书桌上的N张牌,他决定给每张染色,目前小春只有3种颜色:红色,蓝色,绿色.他询问Sun有多少种染色方案,Sun很快就给出了答案.进一步,小春要求染出Sr张红 ...

  6. PowerShell_零基础自学课程_6_PS中获取帮助信息详解、管道、格式化输

    前些文章陆续的说了一些关于这些主题,但是讨论的都不够深入,今天我们深入的了解一下获取帮助信息.管道以及格式化输出的内容. 一.获取帮助信息 在PS中获取帮助信息,最常用的有: -? .get-comm ...

  7. flexbox自动完成

    1.引入文件 <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js" ty ...

  8. 通过Excel来集中管理资源文件

     在支持双语或多语种项目中,常常需要编辑多个文件来添加资源项,感觉比较繁琐,所以想做一个可以集中管理资源文件的工具.借助Excel,使用Excel来记录,并且通过Excel可以进行分页分模块来规划 ...

  9. extjs两个tbar问题

      版本:extjs3.4   接触过extjs的同志们都知道每个panel都有一个tbar(top bar 上面工具栏) ,bbar(bottom bar 底部工具栏)      大家做查询页面,一 ...

  10. 在iOS上present一个半透明的viewController

    UIViewController *viewController = [[UIViewController alloc]init]; UIViewController* controller = se ...