首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

模板类有个有关问题

2012-03-16 
模板类有个问题再看开源代码,一下是代码片段。C/C++ codetemplate class TYPE class CSmartPtr{public:TY

模板类有个问题
再看开源代码,一下是代码片段。

C/C++ code
template <class TYPE> class CSmartPtr{public:    TYPE * m_pObject;    BOOL m_bArray;    BOOL m_bDelete;   __forceinline TYPE * GetPtr() const    {        return m_pObject;    }    __forceinline operator TYPE * () const    {        return m_pObject;    }    __forceinline TYPE * operator ->() const    {        return m_pObject;    }    // declare assignment, but don't implement (compiler error if we try to use)    // that way we can't carelessly mix smart pointers and regular pointers    __forceinline void * operator =(void *) const;};


C/C++ code
class CIO{    //这个里面的函数都是纯虚的,应该是作为一个抽象来用,没有符号重载};


C/C++ code
int main(){   CSmartPtr<CIO> m_spIO;   if(m_spIO == NULL)      {      return -1;   }   return 0;}


有个问题关于m_spIO的。
我看到汇编是
Assembly code
004664A2  mov         ecx,dword ptr [ebp-14h] 004664A5  add         ecx,8 004664A8  call        CSmartPtr<CIO>::operator CIO * (45237Eh)       004664AD  test        eax,eax 004664AF  jne         CAPEInfo::GetFileInformation+56h (4664B6h) 004664B1  or          eax,0FFFFFFFFh 004664B4  jmp         CAPEInfo::GetFileInformation+0BEh (46651Eh) 


当比较m_spio是否为null的时候,编译器为啥会翻译成CSmartPtr<CIO>::operator CIO * 这个默认的符号函数?




[解决办法]
这个跟==的重载无关。

因为NULL是空指针常量,它需要一个指针与它比较,由于m_spIO不是指针,但是一个类对象,这就需要一定的转换,于是就会考察该类是否含有合适的用户自定义函数(因为用户自定义转换也属于标准转换序列中的一员),恰好这个类可以转换为指针,这次就调用这个函数了。

对于用户自定义转换函数的使用要慎重,因为比较容易出现二义性或者让使用者意想不到的事情。
[解决办法]
转换函数,

 
[解决办法]
探讨

引用:
那个指针转换函数必定是设计者设计的,编译器不会自动生成这玩意。


又回到最初的问题了~~~

他没有重载==,只是重载了*这个符号。

而且在那个表达式里面他也没有用到*,只是用到==。那么应该在编译的时候,调用了编译器自己的默认 ==。
关键是为啥又多了一个到 * 的转换。

看你之前的回复稀里糊涂的,觉得似乎是这样,似……

热点排行