模板类有个问题
再看开源代码,一下是代码片段。
- 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不是指针,但是一个类对象,这就需要一定的转换,于是就会考察该类是否含有合适的用户自定义函数(因为用户自定义转换也属于标准转换序列中的一员),恰好这个类可以转换为指针,这次就调用这个函数了。
对于用户自定义转换函数的使用要慎重,因为比较容易出现二义性或者让使用者意想不到的事情。
[解决办法]
转换函数,
[解决办法]