以实践的方式学习C++ &(引用)

1.第一个例子:

假设:

int var1 = 224; //存放var1的值224的内存地址是0x12ABCDEF
则以下Code:
int var2 = var1;   // 将var1的值复制给var2.
int& var2 = var1;//var2 是var1 的别名(var2是var1的引用),var1= var2 = 224,var1的值未发生复制,它们的值的地址都是0x12ABCDEF

int 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现在是224

foo.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、自动化、软件团队

支持我的工作:  https://me.alipay.com/garygao
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值