你好,非常感谢你回答我的问题,现在还有点疑问想问你:
以下是我的程序:
typedef struct MyRect{
public:
int _x1, _y1, _x2, _y2;
}*LPMYRECT;class CMyRect : public MyRect{
public:
operator LPMYRECT();
CMyRect& operator + (CMyRect rect);
CMyRect(int x1, int y1, int x2, int y2);};CMyRect::operator LPMYRECT(){
printf("Run in operator LPMYRECT ...\n");
return this;
}
CMyRect& CMyRect::operator +(CMyRect rect){
_x1 += rect._x1;
...
return *this;
}
CMyRect::CMyRect(int x1, int y1, int x2, int y2)
{
_x1 = x1; _y1 = y1; _x2 = x2; _y2 = y2;
}void MyPtInRect(LPMYRECT pRect){
printf("In rect:%d\n", pRect->_x1);
}int main(int argc, char* argv[])
{
CMyRect rect(2,3,4,5);
// CMyRect *pRect = rect.operator LPMYRECT;
MyPtInRect(rect); return 0;
}我的问题是:根据CMyRect的定义,operator LPMYRECT是该类的一个成员函数,那么该函数的函数名,返回值,函数参数都是些什么啊?
对于像CMyRect& operator + (CMyRect rect);这样的操作符重载函数,其函数可以理解为operator+,返回值为CMyRect对象的引用,参数为rect。但是对于operator LPMYRECT()来说,其函数名又是什么呢?
还有对operator+的调用我可以通过rect.operator+(...)来实现,但是对operator LPMYRECT来说,为什么不能使用CMyRect *pRect = rect.operator LPMYRECT呢?
这样定义的LPMYRECT是不是只能用做对函数的声明?

解决方案 »

  1.   

    注意对比一下CString::operator LPCTSTR的作用。另外建议你把它定义为:
    operator LPMYRECT() const;
      

  2.   

    另外,声明成operator LPMYRECT() const;的形式是为了保证所返回的指针不被修改还是指针指向的内容不被修改?
      

  3.   

    LPMYRECT 又是怎样同时扮演函数参数类型和操作符的角色的呢?
      

  4.   

    Q1.根据CMyRect的定义,operator LPMYRECT是该类的一个成员函数,那么该函数的函数名,返回值,函数参数都是些什么啊?
    A1.此种重载称为“类型转换运算符重载”,它用来将对象转换成类型名规定的类型,这个函数通过在关键字operator后跟随想要转换到的类型的方法,将当前类型转换为希望的类型。它必须是非静态的,成员函数,不能是友元函数,并且,不能指定返回类型——返回类型就是我们正在重载的运算符的名字。另外注意:C++中,转换运算符和转换构造函数互逆.Q2.对于像CMyRect& operator + (CMyRect rect);这样的操作符重载函数,其函数可以理解为operator+,返回值为CMyRect对象的引用,参数为rect。但是对于operator LPMYRECT()来说,其函数名又是什么呢?
    A2.函数名就是operator LPMYRECT。Q3.还有对operator+的调用我可以通过rect.operator+(...)来实现,但是对operator LPMYRECT来说,为什么不能使用CMyRect *pRect = rect.operator LPMYRECT呢?
    A3.调用的是rect.operator LPMYRECT()Q4.声明成operator LPMYRECT() const;的形式是为了保证所返回的指针不被修改还是指针指向的内容不被修改?
    A4.const写在最右面表明这是一个const成员函数,它体内不能做任何对对象进行修改的动作。