以实践的方式学习C++ &(引用)
来源:互联网 发布:linux如何安装jmeter 编辑:程序博客网 时间:2024/06/13 02:25
1.第一个例子:
在调用方法setVar2时,由于形参t的类型是引用(int&),所以传递实参时实际上没有复制的动作。因为var2的类型定义为int(而不是int&) ,所以var2= t发生了一次值得复制,j的值被复制给var2,修改j的值不会影响var2.
5.第5个例子
假设:
int var1 = 224; //存放var1的值224的内存地址是0x12ABCDEF则以下Code:
int var2 = var1; // 将var1的值复制给var2.int& var2 = var1;//var2 是var1 的别名(var2是var1的引用),var1= var2 = 224,var1的值未发生复制,它们的值的地址都是0x12ABCDEFint var2 = &var1; //错误, &var1是存储变量var1的值224的地址。 (&在这里是取地址的意思)
var2是var1的别名的意思是,每个变量名代表着内存中的一个块数据,而var2与var1代表的是同一块,所以下面:
var2 = 1104;//此后 var1 也等于1104
2.第2个例子:
class Foo{public: int& setVar1(){return var1;}//返回Foo类的成员变量var的一个别名 void setVar2(int& t){ var2= t;}//调用函数传递参数时是以引用方式传递private: int var1; int var2;};Foo foo;int i = 224;int j = 1104;foo.setVar() = i; //引用可以作为左值,foo的成员var1现在是224foo.setVar2(j); //foo的成员var2现在是1104.
在调用方法setVar2时,由于形参t的类型是引用(int&),所以传递实参时实际上没有复制的动作。因为var2的类型定义为int(而不是int&) ,所以var2= t发生了一次值得复制,j的值被复制给var2,修改j的值不会影响var2.
3.第3个例子
class BigSizeClass
{
//这是一个很占内存空间的类
....
};
void func1(const BigSizeClass& var); //调用函数传递参数时是以引用方式传递,参数传递的只是变量的别名,而不是将BigSizeClass的实例化对象var复制一次,再传递给func1().
void fun2(const BigSizeClass* var); //参数传递的只是指向变量的地址,实参传递的过程中,var也未被复制。
//从这里看,& 与 *有点相似,在调用函数进行参数传递时,实参都没有发生复制,减少了调用时的时间空间的开销。
4.第4个例子
class Foo{public:Foo(){m_var = 1104;}int& var(){return m_var;}private:int m_var;};Foo foo;foo.var() = 224;//(1)获得了foo.m_var的一个别名,所以foo.m_var通过赋值后变为224.int i = foo.var();//(2) i的类型是int ,不是int & ,所以i新开辟了一段内存空间,程序将foo.m_var的值224复制到此内存空间中。int& j = foo.var();//(3) j的类型是 int & ,它是 foo.m_var的别名,指向foo.m_var的内存空间。return 0;
5.第5个例子
class Foo{public:Foo(){m_var = 0;}int fun1(){return m_var;}int& fun2(){return m_var;}private:int m_var;}int main(){Foo foo;int var1 = foo.fun1();//correct,无需解释 int& var2 = foo.fun1(); //error,编译器报错//invalid initialization of non-const reference of type ‘int&’ from a temporary of type ‘int’int var3 = foo.fun2();//correct,回顾一下第1个例子int& var4 = foo.fun2();//correct,var4是foo.m_var的引用 var4 = 4; //correct,现在foo.m_var=4,}
转载本文请注明作者和出处[Gary的影响力]http://garyelephant.me,请勿用于任何商业用途!
Author: Gary Gao( garygaowork[at]gmail.com) 关注互联网、分布式、高性能、NoSQL、自动化、软件团队
- 以实践的方式学习C++ &(引用)
- php 正则 笔记以 及反向引用的实践
- 对对象的操作一定要以引用的方式传递
- android中以项目依赖的方式引用其他项目
- 以STL::map实现引用表的一种方式
- 以引用的方式传递参数避免对象切割
- Word中以交叉引用的方式插入参考文献
- 为什么最好以引用方式捕捉异常
- (引用学习)提升Web应用程序性能的最佳实践
- C# 以嵌入到窗体的方式打开外部exe
- 汇编+C点亮led-以替代uboot的方式执行
- C语言以epoll方式实现的简单socket实例
- 以C语言的方式理解IIC总线
- C++基础学习笔记----第六课(const和引用的扩展、重载函数和C方式编译的深入)
- 以博客的方式备份我的学习笔记
- 以引用记数的方式跟踪管理使用比较复杂指针
- 以传值和传引用的方式传递参数 IN OUT NOCOPY
- 在Servlet中可访问Spring bean对象,但是不能直接以注入的方式引用
- MongoDb在C#中查询
- lamp ubuntu
- 彩信平台软件模块清单
- 数据在磁盘上的分布
- c++静态那些事
- 以实践的方式学习C++ &(引用)
- Android-stagefright与opencore对比
- HDU-2028(最小公倍数)
- C++ primer plus(一)预备知识
- cocos2d-x 中文乱码
- 在linux下联合编译ffmpeg和SDL源码之一
- poj2240 - Arbitrage
- HP大中华区总裁孙振耀退休感言 :
- C语言中#define的用法