重载取地址操作符后怎么求地址?

如果定义这样一个结构体useless和_type,然后定义t是一个_type结构体:

struct useless
{

};
struct _type
{ useless operator & ()
    {

       return useless();

    }
};
_type t;

怎么求t的地址?

出一想,好像有点难,很显然不能直接用&t来取地址,因为重载了&操作符。

其实这题利用了一个技巧:既然对于t,编译器知道它是_type类型,那么就强制让编译器不把t当成_type类型,就是转换它的“审美观”:(char&)t,或者(int&)t或者(long&)t都可以,whatever,只要你随便强制转换下。

其中(char&)t:的意思是将t的地址一下sizeof(char)字节当成char数据处理,把这块地址当成整数看待,不管原来是什么。

类似的(int&)t:的意思是将t的地址一下sizeof(int)字节当成int数据处理。其余的一样。

只要利用了这一条就可以采用取地址的操作了:&(int&)t就表示t的地址,但是现在:&(int&)t还是一个int*指针, 最好还是转换为_type*指针:

_type* q=(_type*)(&(int&)t);

这句的汇编代码如下:

004113BE  lea         eax,[t]
004113C1  mov         dword ptr [p],eax

另其实如果你写成:int* q=(int*)(&(int&)t);对编译器来说是一样的都是求t的地址:

004113BE  lea         eax,[t]
004113C1  mov         dword ptr [p],eax

只不过,如果你这样写的话,q是一个int*指针,下文你如果想用他操作_type型变量,编译器就会报错而已。

 

 

 

 

这样就搞定了。有解释不妥的地方,高手斧正。



另外如果向上文中,没有重载const &的话可以这样: const _type* p= (&(const _type)t);来求t的地址。但是如果重载了,如下所示:

     useless operator & () const

{
return useless();
}

就只能用上面_type* q=(_type*)(&(int&)t);的方法。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值