对前面对于引用的c++入门教程的补充说明

2016-02-19 12:22 7 1 收藏

下面图老师小编跟大家分享一个简单易学的对前面对于引用的c++入门教程的补充说明教程,get新技能是需要行动的,喜欢的朋友赶紧收藏起来学习下吧!

【 tulaoshi.com - 编程语言 】


//程序作者:管宁
//站点:www.cndev-lab.com
//所有稿件均有版权,如要转载,请务必著名出处和作者

#include iostream
#include string
using namespace std;

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的值!


//程序作者:管宁
//站点:www.cndev-lab.com
//所有稿件均有版权,如要转载,请务必著名出处和作者

#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修饰是不能够声明引用的,引用是不能够声明数组的,即不能够声明引用数组!

下面我们要说一下,也是补充中最重要最需要掌握的内容,也是对传统函数操作的内存状态的一个补充学习!

下面我们来看一个例子


//程序作者:管宁
//站点:www.cndev-lab.com
//所有稿件均有版权,如要转载,请务必著名出处和作者

#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变量,呵呵,这么想可能就错了,普通情况下我们在函数内进行普通值返回的时候在内存栈空间内其实是自动产生了一个临时变量,它是返回值的一个副本一个copy,函数在return的时候其实是return的这个临时产生的副本!

数据在内存中的情况如下图!



上图明确表示了副本领事变量的情况!

下面我们再来看一种情况,就是把返回值赋给引用!

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)


//程序作者:管宁
//站点:www.cndev-lab.com
//所有稿件均有版权,如要转载,请务必著名出处和作者

#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

下面我们再看一种情况,这是返回引用给变量的情况!


//程序作者:管宁
//站点:www.cndev-lab.com
//所有稿件均有版权,如要转载,请务必著名出处和作者

#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,这种方式是我们最为推荐的操作方式,因为不产生临时变量直接赋值的方式可以节省内存空间提高效率,程序的可读性也是比较好的!

它在内存中的情况见下图!

最后的一种情况是函数返回引用,并且发值赋给一个引用的情况!

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)


//程序作者:管宁
//站点:www.cndev-lab.com
//所有稿件均有版权,如要转载,请务必著名出处和作者

#include iostream
#include string
using

来源:http://www.tulaoshi.com/n/20160219/1600709.html

延伸阅读
引用是C++引入的新语言特性,是C++常用的一个重要内容之一,正确、灵活地使用引用,可以使程序简洁、高效。 引用简介 引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样。 引用的声明方法:类型标识符 &引用名=目标变量名; :int a; int &ra=a; //定义引用ra,它是变量a...
在c++中,为了解决一些频繁调用的小涵数大量消耗栈空间或者是叫栈内存的问题,非凡的引入了inline修饰符,表示为内联涵数。 !-- frame contents -- !-- /frame contents -- 可能说到这里,很多人还不明白什么是栈空间,其实栈空间就是指放置程序的局部数据也就是函数内数据的内存空间,在系统下,栈空间是有限的,假如频...
指针与引用看上去完全不同(指针用操作符“*”和“-”,引用使用操作符“.”),但是它们似乎有相同的功能。指针与引用都是让你间接引用其他对象。你如何决定在什么时候使用指针,在什么时候使用引用呢? 首先,要认识到在任何情况下都不能使用指向空值的引用。一个引用必须总是指向某些对象。因此如果你使用一个变量并让它指向一个对象,但是...
<C++实践系列C++中的引用(reference) 作者:张笑猛 提交者:eastvc 发布日期:2003-11-22 14:44:07 原文出处:http://objects.nease.net/ 1.简介 2.引用的语法 3.引用使用技巧     3.1 引用和多态     3.2 作为参数     3.3 作为返回值     3.4 什么时候使用引用 4....
01.分析以下程序的执行结果 #includeiostream.h void main() { int a; int &b=a; // 变量引用 b=10; cout"a="aendl; } 解: 本题说明变量引用的方法。b是a的引用,它们分配相同的空间,b的值即为a的值。 所以输出为 a=10。 注重:引用是引入了变量或对明的一个 义词...