《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位置赋值。