把我弄混淆的操作符重载

《windows核心编程》里有看到这样一句话:

g_mmf[dwOffset * 1024] = (BYTE) 
               GetDlgItemInt(hWnd, IDC_BYTE, NULL, FALSE);
CMMFSparse g_mmf; g_mmf是个类。把等号两边的内容换成等价的代码就成了:g_mmf[0] = 10;

我的第一感觉就是,类重载了[]操作符,找定义,只找到这一句:
operator PBYTE() const { return((PBYTE) m_pvFile); }

这句奇怪了,查询资料,网友说g_mmf是个数组或是指针。一开始我以为他们说错了呢,后来我知道这是为什么了。

为了以后遇到不在迷惑,现总结一下几种操作符重载。


下面的代码试着调试下就知道每种情况了。

struct STRU {
	int a;
	STRU() : a(1) {}
};

class CTest {
private:
	STRU m_st;
	PVOID m_data;
public:
	//函数操作符;
	STRU operator()(int num) {
		m_st.a += num;
		return m_st;
	}
	
	//一般的重载;
	CTest& operator+=(const CTest& other);
	
	//单参构造;其它类型转CTest类型;
	CTest(STRU st) {
		m_data = malloc(100);
		m_st = st;
	}
	
	//类型转换操作符函数;CTest类型转其它类型;
	operator PBYTE() const { return((PBYTE) m_data); }
};

int _tmain()
{
	STRU st_1;
	st_1.a = 9;
	//单参构造;结构体转CTest类型;
	CTest t = st_1;
	
	//函数操作符;类实例像函数一样用;
	STRU st = t(3);
	st = t(5);
	
	//类型转换操作符函数;CTest转其它类型;
	t[0] = (BYTE)5;
}
按理说最后一句t[0] = (BYTE)5; 写成PBYTE pB = t;; 大家毫无疑问理解,CTest类型转其它类型嘛。

但这样写它确实把t类型转成指向m_data的PBYTE类型了!

所以结合起来,

g_mmf[dwOffset * 1024] = (BYTE) 
               GetDlgItemInt(hWnd, IDC_BYTE, NULL, FALSE);
operator PBYTE() const { return((PBYTE) m_pvFile); }

 就不难理解了,它给g_mmf类的m_pvFile成员的第dwOffget * 1024位置赋值。 
  

你可能感兴趣的:(windows开发)