c++ 转型为 引用类型 的作用

情景:近来看到

1.《深入浅出MFC》中p128 有如此语句:

ar >> (WORD&) m_center.x;

ar >> (WORD&) m_center.y;

ar >> (WORD&) m_radius;

之前也知道这几句无非就是提取数据放到这里面,但没有弄清为什么要加一个 & 符号,都是囫囵吞枣,照猫画虎的学着做。。

2. 还有, 微软预定义的  #define _ADDRESSOF(v)   ( &reinterpret_cast<const char &>(v) )。


test

#include "stdafx.h"
#include<iostream>
using namespace std;

class Int
{
public:
	int a;

	Int(int _a) : a(_a) 
	{
		cout << "                Construct Int... " << endl;
	}
};

class TwoInt
{
public:
	int b;
	int c;

	TwoInt(int _b, int _c) : b(_b), c(_c)
	{
		cout << "Construct  TwoInt.. " << endl;		
	}
};

// 注意看 cin 对象的 >>,
// 在istrem文件中如此定放 _Myt& __CLR_OR_THIS_CALL operator>>(unsigned short& _Val){...} 的定义就知了
void testFunc(Int& i) 
{
	cout << "testFunc()  : " << i.a << endl;

	i.a = 5000;
}


// 测试下内置类型时的情况
void test(int& i)
{
	i = 845556;
}


int main()
{
	TwoInt testVar(12, 99);

#if 1
	testFunc((Int&)testVar.b); // 注意看这两句打印出的信息,或是反汇编出来观察
#else
	testFunc((Int)testVar.b);
#endif

	cout << testVar.b << endl; // 也注意观察这句对应于上面两种情况转出的变化。


	// 以下内容测试下内置类型的情况
	cout << "==============================" << endl;

	// 注意看这里 VS2010 反汇编出来是一样的

	test((int&)testVar.b);
	//010815F1  mov         eax,dword ptr [testVar]  
	//010815F4  push        eax  
	//010815F5  call        test (1081262h)  
	//010815FA  add         esp,4  

		test(testVar.b);
	//010815FD  mov         eax,dword ptr [testVar]  
	//01081600  push        eax  
	//01081601  call        test (1081262h)  
	//01081606  add         esp,4  

	cout << testVar.b << endl;
}



结论:对于非内置类型的,如果不加上& 的话,会因为转型而产生临时对象。
     对于内置类型的,则是一样。。 


ps. vs2010 编译器对于好些产生临时对象的,已经优化的不错了。。



ps. 纯好奇之作, 屠龙之技也,不足一看..




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值