MFC中的运算符重载

来源:互联网 发布:淘宝运费险 编辑:程序博客网 时间:2024/06/05 21:05
新建一个“基于对话框"的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);
}
原创粉丝点击