引用知识总结

一.引用

1. 定义:就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样。

引用的声明方法:定义引用ra,它是变量a的引用,即别名。

类型标识符 &引用名=目标变量名;如:

                      int  a;

int  &ra=a;

在此处,“&”为引用运算符,ra是整形变量a的别名,这样,对ra的操作实际上就是对a的操作,对ra的赋值就是对a的赋值。ra = 999;(a = 999;)

2.引用的地址

#分别取a与其别名ra的地址并输出,会发现两者存储地址是一样的,所以对ra的操作实际上就是对a的操作。

3.引用就是别名常量

#引用这个别名是专属于某一变量名的,引用受影响则其原变量也要受影响,一同被赋值。

4.引用对象

#可以定义一个对象的别名,如:

Human  Mike;

Human  &rMike = Mike;

#但是不能定义一个类的别名,如:

Human  &rHuman = Human;(×)

因为Human是一种类型,它没有具体的内存地址。

一个对象的引用和它的使用方法一样,用类的成员运算符(.)来访问成员数据和方法。

 

二.传递参数

1.按值传参

如交换函数swap,按值从主函数中向执行函数中传参,只是对参数的副本操作而已,执行完会将副本的结果释放掉,主函数最后得不到正确的结果。

2.按指针传参

void  swap(int  *a,int  *b)

swap(&a, &b);

由a和b的内存地址间接访问a和b的值,编译器不用在栈中创建两个值得副本,只要传递a和b的地址即可,那么在函数中对*a和*b的操作,就是对a和b原始值的操作。

3.按引用传参

void  swap(int  &a,int  &b)

swap( a,  b);

4.用指针返回多值

int  func(int  *a, int  *b, int  *c)

func(&a, &b, &c);

5.用引用返回多值

int  func(int  &a, int  &b, int  &c)

func(a, b, c);

三.传递对象

1.用值传递对象

按值传递对象,假如该对象的数据较多时,这种拷贝带来的内存开销是非常大的,不可取。

2.用指针传递对象

Iint  main()

{

A  a;

func(&a);

return  0;

}

A  *func(A   *one)

{

return  one;

}

3.使用const指针来传递对象

采用指针来传递对象,虽然可以避免调用复制构造函数和析构函数,但是由于它得到了该对象的内存地址,可以随时修改对象的数据,因此它实际上破坏了按值传递的保护机制。

不过对此我们仍然有解决办法,那就是用const指针来传递对象,这样可防止任何试图对该对象的数据进行的操作行为,并且保证返回一个不被修改的对象。

const  A  *const func(const  A   *const one)

{

cout<<one->get()<<endl;

return  one;

}

4.使用引用来传递对象

A  &func(A   &one)

{

cout<<one.get()<<endl;

return  one;

}

5.引用与指针的区别

#指针可以为空,引用不能为空;

#指针可以被赋值,引用不可以被赋值;

#指针可以指向堆中空间,引用不可以指向堆中空间。

#指针指向一块内存,它的内容是所指内存的地址;而引用则是某块内存的别名。

#引用只能在定义时被初始化一次,之后不可变;指针可变;引用“从一而终”,指针可以“见异思迁”。

#引用没有const,指针有const,const的指针不可变;(具体指没有int& const a这种形式,而const int& a是有的,  前者指引用本身即别名不可以改变,这是当然的,所以不需要这种形式,后者指引用所指的值不可以改变)。

#“sizeof 引用”得到的是所指向的变量(对象)的大小,而“sizeof 指针”得到的是指针本身的大小。

#指针和引用的自增(++)运算意义不一样。

#引用是类型安全的,而指针不是 (引用比指针多了类型检查)。

四.引用总结

(1)在引用的使用中,单纯给某个变量取个别名是毫无意义的,引用的目的主要用于在函数参数传递中,解决大块数据或对象的传递效率和空间不如意的问题。

(2)用引用传递函数的参数,能保证参数传递中不产生副本,提高传递的效率,且通过const的使用,保证了引用传递的安全性。

(3)引用与指针的区别是,指针通过某个指针变量指向一个对象后,对它所指向的变量间接操作。程序中使用指针,程序的可读性差;而引用本身就是目标变量的别名,对引用的操作就是对目标变量的操作。

(4)使用引用的时机。流操作符<<和>>、赋值操作符=的返回值、拷贝构造函数的参数、赋值操作符=的参数、其它情况都推荐使用引用。

时间: 2024-10-11 07:35:07

引用知识总结的相关文章

企业知识管理系统

概述 4U知识管理系统基于全新的理念设计,是为了摆脱传统知识生产过程中的种种不便和束缚,宗旨在于最大化的提高知识生产和运用效率,通过内容与形态的分离,实现"把时间留给创作而不是过程",一方面能最大化的提高知识创作者的知识生产效率,另一方面能迅速的提升企业的专业化.规范化知识交付能力:另外,通过特有的知识共享和运用模式,改变以往的知识生产模式,促进个人作业向协同作业转变,显著加强企业知识内容的细分和专业化建设,加快知识的再生产效率. 4U知识管理系统对传统知识创作流程进行了大量创新和优化

C++学习体会--引用方式复制类对象

C++学习体会--引用方式复制类对象 引用的重要性实际体现在函数的形参和函数的返回值.一般引用也只是出现在这两个地方. 引用方式的好处,如果是体现在形参,在使用函数的时候,实参必定会初始化形参,如果不加引用,系统会创建实参的副本将值传递给形参,这样会造成资源额外的占用.为了节省资源的占用,通过一种引用的方式,达到这个效果,因为引用知识将实参的地址给了形参,处理形参,如同处理实参. 下面将给出程序使用的例子:引用的重要性体现在形参上 #include <iostream> using names

Perl子程序引用和匿名子程序

子程序也有引用,也有匿名子程序.假设你已经具备了数组.hash的引用知识,所以这里简单介绍一下. $ref_sub = \&mysub; # 子程序引用,&符号必须不能少 &{$ref_sub}(ARGS) # 解除子程序引用,传递参数ARGS &$ref_sub(ARGS) # 解除子程序引用 $ref_sub->(ARGS) # 解除子程序引用 $ref_sub->() # 传递空参数 sub {...}; # 定义匿名子程序,sub后面没有名称 $ref_

NDK开发总结

NDK开发差不多结束了, 估计后面也不会再碰了诶, 想着还是写个总结什么的,以后捡起来也方便哈.既然是总结,我这里就不会谈具体的细节,只会记录下我觉得重要的东西, 所以这篇随笔不是为萌新学习新知识准备的, 而是复习用的, 有些知识默认读者知道,就算忘了也能根据提示想起来.这里虽然是总结有些地方还是很细的2333. 方法论: 1. 我在实践中大概是这样的流程, 想好大概的java和jni代码交互流程, 然后编写jni接口代码, 然后在接口代码里面调用c++或者c写的方法, 如果不跨线程的话, 我会

几款常见的数学教学软件

信息技术的发展对数学教育产生了很大的影响,不仅为改进数学教学提供了一种新的有效手段,而且对数学的学习.数学的理解以及数学的应用,包括课程内容的选择与组织方式等都将产生十分重要的影响.教育信息化如果缺少实用可靠的软件支持,那么这种新的教学方式也是无法开展的.下面小编就和大家一起来扒一扒目前运用比较多的几款数学教学软件,看看它们的优势和不足在哪?方便广大老师们在教学时有个正确的抉择. 一.几何画板 推荐指数:★★★★★ 几何画板软件+激活码获取地址 几何画板是美国Key Curriculum Pre

python写一个通讯录V2.0

python写一个通讯录step by step V2.0 引用知识 list + dict用于临时存储用户数据信息 cPickle用于格式化文件存取 依旧使用file来进行文件的存储 解决问题 1.操刀开始去做 原始代码 实现功能(可做模板) 1.判断输入内容是否在给出的menu目录内,在的话,返回对应结果,不在就报错 2.调用os模块的exit功能 3.字典配合循环加上函数实现switch的功能 #!/usr/bin/env python #coding:utf8 #Author:zhuim

java中关于对象的可达可用问题

(注:本文引用知识纯粹为技术交流,未经允许不可私自转载)Java中其实也有内存泄露,就是因为对象无用却可达的原因.这个细分细分下来有三个1. 不可用不可达------>这种情况GC会帮我们回收掉,而C++不会2. 不可用可达 ------>这种情况会存在内存泄露3. 可用可达 ------>正常使用 1.不可用不可达就是我们的变量作用域结束了,不可用不可达2. 不可用可达,就是我们自己没有将其对象, 举个例子:在这个例子中,我们循环申请Object对象,并将所申请的对象放入一个Vecto

C++ 中有关const引用的一点小知识

在读<C++ Primer>时,发现之前对const的概念不是很清晰,只知道如何去使用,于是翻开const引用部分又阅读了一遍,发现有两点自己要注意的地方 1.const限定的对象不可以初始化非const引用 ex. 1 const int src = 512; 2 const int &ok_dest = src; //ok: 引用和初始化对象都是const 3 int &err_dest = src; //error : 引用为非const 原因很简单, src 是不可以被

C#学习笔记(基础知识回顾)之值类型与引用类型转换(装箱和拆箱)

一:值类型和引用类型的含义参考前一篇文章 C#学习笔记(基础知识回顾)之值类型和引用类型 1.1,C#数据类型分为在栈上分配内存的值类型和在托管堆上分配内存的引用类型.如果int只不过是栈上的一个4字节的值,该如何在它上面调用方法? 二:值类型转换为引用类型--装箱 2.1CLR对值类型进行装箱时:新分配托管堆内存,将值类型的实例字段拷贝到新分配的内存中,返回托管堆中新分配对象的地址.这个地址就是一个指向对象的引用. int i = 10; Object obj = i; 三:将引用类型转换为值