C++中引用的使用总结

1引用的定义

引用时C++对C的一个重要的扩充,引用的作用是给变量起一个别名。

例如:

int a;

int &b=a;//声明b是a的引用

经过以上的声明,b就成为了a的别名,a和b的地位以及作用都是一样的。

将b声明为a的引用,不需要再为b开辟新的单元,b和a在内存中占同一存储单元,它们具有相同的地址。


代码如下:

#include<iostream>
using namespace std;
int main(){
         int a=10;
         int &b=a;//声明b是a的引用
         cout<<"b="<<b<<endl;
         a=a-5;
         cout<<"b="<<b<<endl;
         b=b-1;
         cout<<"a="<<a<<endl;            
         return 0;
}

在程序中,

声明了b是a的引用,然后输出b=10;

然后使a的值减小5,再输出b=5,说明b会随着a的变化做出变化;

然后使b的值减小1,再输出a=4,说明a会随着b的变化做出变化。

在声明一个引用的同时,必须同时对它进行初始化,即声明它代表哪一个变量。在声明变量b是变量a的引用后,就可以将b作为a的别名来进行操作,并且b不能再作为其他变量的引用(别名)。

声明引用,而不进行初始化操作:


代码如下:

#include<iostream>
using namespace std;
int main(){
         int a=10;
         int &b;             
         return 0;
}

编辑器报错

========================================

已经申明p为a的引用之后,在声明p为b的引用


代码如下:

#include<iostream>
using namespace std;
int main(){
         int a=10;
         int &p=a;
   int b=5;
   int &p=b;             
         return 0;
}

编辑器报错:

注意区分:

int &b=a;表示b是a的引用

int *b=&a;表示b是指针变量,并且b的值是a的地址

引用不是一种独立的数据类型,必须指定其代表的某一类实体(如变量,类对象),不能定义引用数组,不能定义指向引用的指针,也不能定义指针的引用。

2 引用作为函数的参数

C++增加引用机制,主要是把它作为函数参数,以扩充函数传递数据的功能。

函数的参数传递有三种情况

将变量名作为形参和实参

这是传给形参的是变量的值,传递是单向的。如果在执行被调用函数期间,形参的值发生变化,是不能反映到实参的。因为形参只是复制了实参的数值,两变量并不是占用同一存储单元。


代码如下:

#include<iostream>
using namespace std;
int main(){
 void change(int x,int y);
 int i=3,j=2;
 change(i,j);
 cout<<i<<endl;
 cout<<j<<endl;
 return 0;
}
void change(int x,int y){
    int z;
    z=x;
    x=y;
    y=z;
}

x复制了i的值,y复制了j的值。但i和j与x和y占不同的存储单元,因此只改变x和y的值,并不能改变i和j的值。

将变量地址作为实参,指针作为形参

这种方式仍然是值传递的方式,不过他传递的不是变量的数值,而是变量的地址。因此可以在被调用函数中,通过调用指针指向的变量来改变相应变量的值。


代码如下:

#include<iostream>
using namespace std;
int main(){
         void change(int * x,int * y);
         int i=3,j=2;
         change(&i,&j);
         cout<<i<<endl;
         cout<<j<<endl;
         return 0;
}
void change(int * x,int * y){
         int *z;
         z=x;
         x=y;
         y=z;
}

因为是值传递,所以只改变指针的值,而不去改变指向的变量的值,还是不能改变相应的变量的值。


代码如下:

#include<iostream>
using namespace std;
int main(){
         void change(int * x,int * y);
         int i=3,j=2;
         change(&i,&j);
         cout<<i<<endl;
         cout<<j<<endl;
         return 0;
}
void change(int * x,int * y){
         int *z;
         *z=*x;
         *x=*y;
         *y=*z;
}


当改变指针指向的变量的值的时候,相应的变量的数值也会发生变化。

将变量名作为实参,引用作为形参

将变量名作为形参和实参和将变量地址作为实参,指针作为形参都是采用的值传递的方式。而引用作为形参的时候,采用的是地址传递的方式。


代码如下:

#include<iostream>
using namespace std;
int main(){
 void change(int & x,int & y);
 int i=3,j=2;
 change(i,j);
 cout<<i<<endl;
 cout<<j<<endl;
 return 0;
}
void change(int & x,int & y){
  int z;
  z=x;
  x=y;
  y=z;
}

在函数change的形参中声明了a,b是整形变量的引用。当main函数调用change函数时,把实参i的地址传递给形参x,把实参j的地址传递给形参y,从而使i和x共享同一个单元,使j和y共享同一个单元。也可以理解成,把i的变量名传递给了x,把j的变量名传递给了y。

引用作为形参与指针变量作为形参的区别

1使用引用类型,就不必在swap函数中声明形参是指针变量。指针变量要另外开辟内存单元,其内容是地址。而引用不是一个独立的变量,不单独占内存单元,引用的数据类型应该应该与实参相同。

2 在main函数中,实参不必用变量的地址,而是直接用变量名。系统向形参传递的是实参的地址而不是实参的值。

3 由于不能声明指针的引用,那我们如何像指针那样传递可以通过传递数组的首元素来实现传递整个数组的数据呢?

使用指针作为形参:


代码如下:

#include<iostream>
using namespace std;
int main(){
void Print(int *p,int n);
    int a[5]={1,2,3,4,5};
    Print(a,5);
    return 0;
}
void Print(int *p,int n){
    int i;
    for(i=0;i<n;i++){
     cout<<p[i]<<endl;
    }
}

======================================================

使用引用作为形参


代码如下:

#include<iostream>
using namespace std;
int main(){
void Print(int &p,int n);
    int a[5]={1,2,3,4,5};
    Print(a[0],5);
    return 0;
}
void Print(int &p,int n){
    int i;
    int *a=&p;
    for(i=0;i<n;i++){
       cout<<a[i]<<endl;
    }
}

因为引用就是给原来的变量起了别名,并且不能声明指针的引用,所以我们就声明指针指向的变量的引用,然后再对引用取地址,就达到了这个目的。

为了更清楚的说明,下面再举一个例子:


代码如下:

#include<iostream>
using namespace std;
int main(){
   int i=10;
   int *p;
   p=&i;//将i的地址赋给指针p
   int &y=*p;//将y作为指针p指向的变量的引用
   cout<<y<<endl;
   if(&y==p)cout<<"succeed"<<endl;//检查y的地址和指针p的值是否相等
   return 0;
}




代码如下:

#include<iostream>
using namespace std;
int main(){
   int a[5]={1,2,3,4,5};
   int &y=a[0];//声明y作为数组的首元素的引用
   int *p=&y;//将y的地址赋给指针p
   int i=0;
   for(;i<5;i++){
      cout<<p[i]<<endl;
   }
   return 0;
}

(0)

相关推荐

  • 从C语言过渡到C++之引用(别名)

    今天要讲的是C++中我最喜欢的一个用法--引用,也叫别名. 引用就是给一个变量领取一个变量名,方便我们间接地使用这个变量.我们可以给一个变量创建N个引用,这N + 1个变量共享了同一块内存区域. 1. 声明引用 创建引用的格式如下: 数据类型 引用名 = 原变量 比如: int a = 1; int& b = a; 在这段代码中,我们给变量a创建了一个别名b.它们公用同一块内存区域,就是创建变量a时申请的区域. 注意:由于引用并不需要申请一块新的内存空间,因此在建立引用时只能声明,不能定义. 面

  • 探讨:C++中函数返回引用的注意事项

    函数 返回值 和 返回引用 是不同的函数返回值时会产生一个临时变量作为函数返回值的副本,而返回引用时不会产生值的副本,既然是引用,那引用谁呢?这个问题必须清楚,否则将无法理解返回引用到底是个什么概念.以下是几种引用情况:1,引用函数的参数,当然该参数也是一个引用 复制代码 代码如下: const string &shorterString(const string &s1,const string &s2)      {             return s1.size()&l

  • C++中引用&与取地址&的区别分析

    C++中的引用&与取址&是很多初学者经常容易出错的地方,今天本文就对此加以分析总结,供大家参考之用. 具体而言,一个是用来传值的 一个是用来获取首地址的 &(引用)==>出现在变量声明语句中位于变量左边时,表示声明的是引用.      例如: int &rf; // 声明一个int型的引用rf &(取地址运算符)==>在给变量赋初值时出现在等号右边或在执行语句中作为一元运算符出现时表示取对象的地址. 在C++中,既有引用又有取地址,好多人对引用和取地址不

  • 浅析C++中结构体的定义、初始化和引用

    定义:结构体(struct)是由一系列具有相同类型或不同类型的数据构成的数据集合,也叫结构. 声明一个结构体类型的形式是: 复制代码 代码如下: struct Student{      //声明一个结构体类型Student  int num;         //声明一个整形变量num  char name[20];   //声明一个字符型数组name  char sex;        //声明一个字符型变量sex  int age;         //声明一个整形变量age  float

  • 深入解析C++中的引用类型

    c++比起c来除了多了类类型外还多出一种类型:引用.这个东西变量不象变量,指针不象指针,我以前对它不太懂,看程序时碰到引用都稀里糊涂蒙过去.最近把引用好好地揣摩了一番,小有收获,特公之于社区,让初学者们共享. 引用指的是对一个对象的引用.那么什么是对象?在c++中狭义的对象指的是用类,结构,联合等复杂数据类型来声明的变量,如 MyClass myclass,CDialog  mydlg,等等.广义的对象还包括用int,char,float等简单类型声明的变量,如int a,char b等等.我在

  • C++中对象的常引用总结

    直接传递对象名 用对象名做函数参数时,在函数调用时将建立一个新的对象,它是形参对象的拷贝. ================下面给出一个直接传递对象名的例子程序1.1================== 复制代码 代码如下: #include<iostream>using namespace std;class Time { public:  Time(int,int,int);//构造函数   void Print();//输出信息函数   void reset(Time t);//重置函数

  • C++标准之(ravalue reference) 右值引用介绍

    1.右值引用引入的背景 临时对象的产生和拷贝所带来的效率折损,一直是C++所为人诟病的问题.但是C++标准允许编译器对于临时对象的产生具有完全的自由度,从而发展出了CopyElision.RVO(包括NRVO)等编译器优化技术,它们可以防止某些情况下临时对象产生和拷贝.下面简单地介绍一下CopyElision.RVO,对此不感兴趣的可以直接跳过: (1)CopyElision CopyElision技术是为了防止某些不必要的临时对象产生和拷贝,例如: 复制代码 代码如下: structA{ A(

  • C++ 中引用与指针的区别实例详解

    C++ 中引用与指针的区别实例详解 引用是从C++才引入的,在C中不存在.为了搞清楚引用的概念,得先搞明白变量的定义及引用与变量的区别,变量的要素一共有两个:名称与空间. 引用不是变量,它仅仅是变量的别名,没有自己独立的空间,它只符合变量的"名称"这个要素,而"空间"这个要素并不满足.换句话说,引用需要与它所引用的变量共享同一个内存空间,对引用所做的改变实际上是对所引用的变量做出修改.并且引用在定义的时候就必须被初始化.     参数传递的类型及相关要点: 1 按值

  • 在Web用户控件中引用样式表中样式的方法

    如何在Web用户控件中引用样式表中的样式 复制代码 代码如下: <%@ Control Language="C#" AutoEventWireup="true" CodeFile="gl1.ascx.cs" Inherits="admin_gl1" EnableTheming="True" %> < link href="../App_Themes/qiantai.css&quo

  • webpack中引用jquery的简单实现

    1.首先需要添加项目中jquery的依赖 npm install jquery --save-dev 2.参考配置代码: var webpack = require("webpack"); var path = require("path"); module.exports = { entry:{ home:"./src/js/home.js", -- }, output:{ path:__dirname+"/dist/js"

  • php中引用符号(&)的使用详细介绍

    与C语言中的指针是有差别的.C语言中的指针里面存储的是变量的内容在内存中存放的地址变量的引用. PHP 的引用允许你用两个变量来指向同一个内容 $a="ABC"; $b =&$a; echo $a;//这里输出:ABC echo $b;//这里输出:ABC $b="EFG"; echo $a;//这里$a的值变为EFG 所以输出EFG echo $b;//这里输出EFG 函数的传址调用 传址调用我就不多说了 下面直接给出代码 <?php functio

  • Android中引用其他程序的文本资源超简单方法

    在Android中引用其他程序的文本资源并不是很常见,但是有时候还是很是有需要的,通常引用的多半是系统的程序的文本资源. 下面以一个超简单的例子,来展示以下如何实现. 复制代码 代码如下: public void testUseAndroidString() { Context context = getContext();     Resources res = null;     try {         //I want to use the clear_activities strin

  • Python中在脚本中引用其他文件函数的实现方法

    在导入文件的时候,Python只搜索当前脚本所在的目录,加载(entry-point)入口脚本运行目录和sys.path中包含的路径例如包的安装地址.所以如果要在当前脚本引用其他文件,除了将文件放在和脚本同一目录下,还有以下几种方法, 1. 将文件所在位置添加到sys.path中 import sys sys.path.insert(0, '/path/to/application/app/folder') # or sys.path.append('/path/to/application/a

  • python中引用与复制用法实例分析

    本文实例讲述了python中引用与复制用法.分享给大家供大家参考.具体分析如下: 在python中,任何不可变对象是传值的,而可变对象是传引用的. 不管是向函数传递参数或者是任何形式的对象复制来说,不可变对象(比如整数,字符串)被真正复制,而可变对象只是复制了一个对他们的引用,即在内存中只有一份对象,而引用两份.   a=b 这样的赋值,就会创建对b的引用,对于象数字和字符串这样的不可变的对象,这种赋值实际是创建了b的一个副本 >>> a='hello' >>> b=a

  • jsp页面中引用其他页面的简单方法

    初看这个标题....大家的感觉一定是好2啊.....博主一定要说jsp的动态引用(jsp:include)和静态引用(@include)了.介绍这两者区别的文章已经烂大街了..一搜一大把..博主竟然还来介绍这些老古董..果断alt+F4... 如果你确实是这么想的...那请先别急着关闭页面...今天我来分享一下自己的理解,算是对烂大街的东西的一点补充吧...(后面文字会比较啰嗦) 首先先说明下为什么会去讨论这个话题. 我在写自己的博客程序的时候(blogv2.labofjet.com),程序中的

  • C++ 中引用和指针的关系实例详解

    C++ 中引用和指针的关系实例详解 1.引用在定义时必须初始化,指针没有要求 int &rNum; //未初始化不能通过编译 int *pNum; //可以 2. 一旦一个引用被初始化为指向一个对象,就不能再指向 其他对象,而指针可以在任何时候指向任何一个同类型对象 int iNum = 10; int iNum2 = 20; int &rNum = iNum; &rNum = iNum2; //不能通过 3. 没有NULL引用,但有NULL指针. int *pNum = NULL

  • Android实现在xml文件中引用自定义View的方法分析

    本文实例讲述了Android实现在xml文件中引用自定义View的方法.分享给大家供大家参考,具体如下: 在xml中引用自定义view 方法一: <view class="com.test.copytext.CopyText" android:layout_width="fill_parent" android:layout_height="wrap_content" /> 方法二: <view class="com.

随机推荐