对C++中引用的补充说明(实例)

2016-02-19 20:00 4 1 收藏

下面是个超简单的对C++中引用的补充说明(实例)教程,图老师小编精心挑选推荐,大家行行好,多给几个赞吧,小编吐血跪求~

【 tulaoshi.com - 编程语言 】

#include iostream   
  #include string   
  using namespace std; 
   !-- frame contents -- !-- /frame contents --  
  void main(int argc,char* argv[])
  { 
      int a=10; 
      int b=20; 
      int &rn=a; 
      coutrn""aendl; 
      cout&rn""&aendl;//c++中是无法取得应用的内存地址的,取引用的地址就是取目标的地址! 
      rn=b;//把引用指向另一个目标----变量b 
      cout&rn""&a""&bendl; 
      rn=100;//试图改变b的值 
      couta""bendl;//输出修改后的结果  
      cin.get(); 
  }
  
    由于引用本身就是目标的一个别名,引用本身的地址是一个没有意义的值,所以在c++中是无法取得引用的内存地址的。取引用的地址就是取目标的地址,c++本身就根本不提供获取引用内存地址的方法。
  
  引用一单初始化,就不在能够被指向其它的目标,虽然编译不会出错,但操作是不起作用的,实际上还是指向最先指向的目标。
  
  上面代码中的rn=b实际在计算机看来就是a=b,所以修改的还是a的值。#include iostream   
  #include string   
  using namespace std; 
   
  void main(int argc,char* argv[])     
  { 
      int a=10; 
      void &rn=a;// 错误的,void即无类型的类型 
      int a[100]; 
      int &ra[100]=a;//错误,不能声明引用数组 
      cin.get(); 
  }  上面的两错误要记住引用的特性,void修饰是不能够声明引用的,引用是不能够声明数组的,即不能够声明引用数组。 更多内容请看C/C++技术专题  C/C++应用实例专题,或   下面我们要说一下,也是补充中最重要最需要把握的内容,也是对传统函数操作的内存状态的一个补充学习。  下面我们来看一个例子: !-- frame contents -- !-- /frame contents -- #include iostream   
  #include string   
  using namespace std; 
   
  float c; 
  
   float test(float,float); 
  void main(int argc,char* argv[])     
  { 
      float pn=test(3.0f,1.2f); 
      coutpn; 
      cin.get(); 
  } 
   
  float test(float a,float b) 
  { 
      c=a*b; 
      return c; 
  }  在上面的代码中我们可能我们可能以为函数返回的就是c变量,呵呵。这么想可能就错了,普通情况下我们在函数内进行普通值返回的时候在内存栈空间内其实是自动产生了一个临时变量temp,它是返回值的一个副本一个copy,函数在return的时候其实是return的这个临时产生的副本。
  
  数据在内存中的情况如下图:  上图明确表示了副本领事变量的情况。 更多内容请看C/C++技术专题  C/C++应用实例专题,或   下面我们再来看一种情况,就是把返回值赋给引用: !-- frame contents -- !-- /frame contents -- #include iostream   
  #include string   
  using namespace std; 
   
  float c; 
  float test(float,float); 
  void main(int argc,char* argv[])     
  { 
      float &pn=test(3.0f,1.2f);//警告:返回的将是临时变量,pn引用将成为临时变量的别名! 
      coutpn; 
      cin.get(); 
  } 
   
  float test(float a,float b) 
  { 
      c=a*b; 
      return c; 
  }  float &pn=test(3.0f,1.2f);这句在bc中能够编译通过,因为bc扩展设置为临时变量设置引用,那么临时变量的生命周期将和引用的生命周期一致,但在vc中却不能通过编译,因为一但test()执行过后临时变量消失在栈空间内,这时候pn将成为一个没有明确目标的引用,严重的时候会导致内存出错。  它在内存中的情况见下图:  我们在图中看到,由于函数仍然是普通方法返回,所以仍然会有一个副本临时变量产生,只不过,这一次只是返回一个目标地址,在main中目标地址被赋予了引用pn。 更多内容请看C/C++技术专题  C/C++应用实例专题,或   下面我们再看一种情况,这是返回引用给变量的情况: !-- frame contents -- !-- /frame contents -- #include iostream   
  
   #include string   
  using namespace std; 
   
  float c; 
  float& test(float,float); 
  void main(int argc,char* argv[])     
  { 
      float pn=test(3.0f,1.2f); 
      coutpn; 
      cin.get(); 
  } 
   
  float &test(float a,float b) 
  { 
      c=a*b; 
      return c; 
  }  这种返回引用给变量的情况下,在内存中,test()所在的栈空间内并没有产生临时变量,而是直接将全局变量c的值给了变量pn,这种方式是我们最为推荐的操作方式,因为不产生临时变量直接赋值的方式可以节省内存空间提高效率,程序的可读性也是比较好的。
  
  它在内存中的情况见下图: 更多内容请看C/C++技术专题  C/C++应用实例专题,或   最后的一种情况是函数返回引用,并且发值赋给一个引用的情况: !-- frame contents -- !-- /frame contents -- #include iostream   
  #include string   
  using namespace std; 
   
  float c; 
  float& test(float,float); 
  void main(int argc,char* argv[])     
  { 
      float &pn=test(3.0f,1.2f); 
      coutpn; 
      cin.get(); 
  } 
   
  float &test(float a,float b) 
  { 
      c=a*b; 
      return c; 
  }  这种情况同样也不产生临时变量,可读和性能都很好,但有一点轻易弄错,就是当c是非main的局部变量或者是在堆内存中临时开辟后来又被fee掉了以后的区域,这种情况和返回的指针是局部指针的后果一样严重,会导致引用指向了一个不明确的地址,这种情况在内存中情况见下图:  由于这种情况存在作用域的问题,故我们推荐采用第三种方式处理。 更多内容请看C/C++技术专题  C/C++应用实例专题,或   接下来我们说几个利用引用作为左值参与计算的例子,这一点一非常重要,对于理解返回引用的函数是非常有帮助的。 !-- frame contents -- !-- /frame contents -- #include iostream   
  
   #include string   
  using namespace std; 
   
  float c; 
  float& test(float,float); 
  void main(int argc,char* argv[])     
  { 
      float &pn=test(3.0f,1.2f); 
      coutpnendl; 
      test(3.0f,1.2f)=12.1;//把函数作左值进行计算! 
      coutpn; 
      cin.get(); 
  } 
   
  float &test(float a,float b) 
  { 
      c=a*b; 
      return c; 
  }  通常来说函数是不能作为左值,因为引用可以做为左值,所以返回引用的函数自然也就可以作为左值来计算了。  在上面的代码中:
  
  float &pn=test(3.0f,1.2f);
  
  进行到这里的时候pn已经指向到了目标c的地址了。
  
  接下来运行了
  
  test(3.0f,1.2f)=12.1;
  
  把函数作左值进行计算,这里由于test是返回引用的函数,其实返回值返回的地址就是c的地址,自然c的值就被修改成了12.1。 更多内容请看C/C++技术专题  C/C++应用实例专题,或

来源:https://www.tulaoshi.com/n/20160219/1622513.html

延伸阅读
  在c/c++中利用数组名作为函数参数传递排序和用指针进行排序的例子。 以下两个例子要非常注重,函数传递的不是数组中数组元素的真实值而是数组在内存中的实际地址。 !-- frame contents -- !-- /frame contents -- #include stdio.h    void main(void)  {  ...
本文中,将要介绍与继续相关的C++/CLI主题,并以现实生活中银行交易的三种形式:存款、取款、转账,来说明类的继续体系,且以一种新的枚举形式来实现。 枚举器 请看例1中声明的类型,它存在于其自身的源文件中,并编译为一个只包含此类型的程序集: 例1: public enum class TransactionType : ...
引用类型也称别名,它是个很有趣的东西。在c++ 下你可以把它看作是另外的一种指针,通过引用类型我们同样也可以间接的操作对象,引用类型主要是用在函数的形式参数上,通常我们使用它是把类对象传递给一个函数。 引用对象采用类型名加上&符号和名称的方式进行定义。例如:(int &test;),这里我们就定义了一个int类型的名为test ...
在C++中,以类、虚函数等为代表的数据抽象功能一直是C++的核心和难点。这里我想结合自己的使用经验,谈谈对C++中抽象的一点浅薄看法! 我认为C++的抽象应该是指:从我们需要解决的问题出发,在与该问题相关的一组关联对象中提取出主要的或共有的部分――说简单一点,就是用相同的行为来操作不同的对象。 从提出问题到找出与该问题...
指针与引用看上去完全不同(指针用操作符’*’和’-’,引用使用操作符’.’),但是它们似乎有相同的功能。指针与引用都是让你间接引用其他对象。你如何决定在什么时候使用指针,在什么时候使用引用呢? 首先,要熟悉到在任何情况下都不能用指向空值的引用。一个引用必须总是指向某些对象。因此假如你使用一个变量并让它指向一个...

经验教程

331

收藏

24
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部