新建一个“基于对话框"的MFC程序,双击”确定“按钮为其增加消息响应函数,代码如下
void CTestDlg::OnBnClickedOk()
{
CRect rect;
GetClientRect(rect);
CString str;
str.Format(_T("width=%d, height=%d"), rect.Width(), rect.Height());
MessageBox(str);
}
这段代码有个问题不知道你想过没有?GetClientRect是CTestDlg从CWnd继承过来的成员函数,其原型为
void GetClientRect( LPRECT lpRect ) const;
传入的参数为指向CRect的指针,但我们传入的确是CRect对象,编译居然正确没有任何错误,且程序正常运行。
实际上这不是偶然,这是因为CRect类重载了LPRECT运算符,也就是如果在需要LPRECT的地方,我们传递的
是CRect,则编译器会调用LPRect运算符函数将CRect转换为LPRect(当然这种转换[或运算符重载]是Microsoft
给我们编写好的,如果没有这种重载编译器就会报错,因为类型不匹配)。
下面给一个自己写的例子,自己好好想想为什么?
class MyPoint;
typedef MyPoint* LPMyPoint;
class MyPoint
{
public:
void output()
{
AfxMessageBox(_T("hello"));
}
operator LPMyPoint()
{
return this;
}
};
void ShowMessage(LPMyPoint lpMyPoint)
{
lpMyPoint->output();
}
void CTestDlg::OnBnClickedOk()
{
MyPoint myPoint;
ShowMessage(myPoint);
}
void CTestDlg::OnBnClickedOk()
{
CRect rect;
GetClientRect(rect);
CString str;
str.Format(_T("width=%d, height=%d"), rect.Width(), rect.Height());
MessageBox(str);
}
这段代码有个问题不知道你想过没有?GetClientRect是CTestDlg从CWnd继承过来的成员函数,其原型为
void GetClientRect( LPRECT lpRect ) const;
传入的参数为指向CRect的指针,但我们传入的确是CRect对象,编译居然正确没有任何错误,且程序正常运行。
实际上这不是偶然,这是因为CRect类重载了LPRECT运算符,也就是如果在需要LPRECT的地方,我们传递的
是CRect,则编译器会调用LPRect运算符函数将CRect转换为LPRect(当然这种转换[或运算符重载]是Microsoft
给我们编写好的,如果没有这种重载编译器就会报错,因为类型不匹配)。
下面给一个自己写的例子,自己好好想想为什么?
class MyPoint;
typedef MyPoint* LPMyPoint;
class MyPoint
{
public:
void output()
{
AfxMessageBox(_T("hello"));
}
operator LPMyPoint()
{
return this;
}
};
void ShowMessage(LPMyPoint lpMyPoint)
{
lpMyPoint->output();
}
void CTestDlg::OnBnClickedOk()
{
MyPoint myPoint;
ShowMessage(myPoint);
}