免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1660 | 回复: 9
打印 上一主题 下一主题

操作符重载的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-05-18 06:10 |只看该作者 |倒序浏览

  1. class CMemDC{

  2. operator CMemDC*() /*这种操作符重载,该怎么调用?*/
  3.     {
  4.         return this;
  5.     }

  6. }


  7. 为什么不是这样重载
  8. CMemDC operator *()
  9.     {
  10.         return this;
  11.     }



复制代码

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
2 [报告]
发表于 2009-05-18 06:36 |只看该作者

回复 #1 mabuc 的帖子

operator*() 是定义了一个一元的"*"操作符。

CMemDC dc;
*dc; // 这里

这个操作符一般是智能指针使用。


operator T(); 是一个转型操作符定义了一个由该类型对象到T类型对象的隐式转换。

CMemDC:: operator CMemDC*(); // 就定义了一个CMemDC对象到CMemDC对象指针的隐式转换。

CMemDC dc;
CMemDC* pdc = dc;

不明白为什么会这么使用 ……


这个操作符的一个例子是:

class file_ptr {
    FILE* fp_;
public:
    file_ptr(const char* name,const char* mode) {
        fp_ = fopen(name,mode);
        if (!fp) throw std:: runtime_error("open file failed");
    }
    ~file_ptr() { fclose(fp_); }
private:
    file_ptr(const file_ptr&);
    file_ptr& operator=(const file_ptr&);

public:
    operator FILE*() {  return fp_;  }
};


void f() {
    file_ptr file("cherrie","w");
    FILE* fp = file;
    fprintf(fp,"1212");
    fprintf(file,"326");
}

论坛徽章:
0
3 [报告]
发表于 2009-05-18 06:42 |只看该作者

回复 #1 mabuc 的帖子

下面这个是对()重载吗?
operator HDC() const { return m_MemoryDC.m_hDC; }

为什么不这样?
HDC operator ()() const { return m_MemoryDC.m_hDC; }

论坛徽章:
0
4 [报告]
发表于 2009-05-18 08:19 |只看该作者
原帖由 mabuc 于 2009-5-17 14:42 发表
下面这个是对()重载吗?
operator HDC() const { return m_MemoryDC.m_hDC; }

为什么不这样?
HDC operator ()() const { return m_MemoryDC.m_hDC; }


前者是重载operator HDC,后者是重载operator(),当然不一样啊,呵呵。

论坛徽章:
0
5 [报告]
发表于 2009-05-18 08:23 |只看该作者
class CMemDC{
public:
operator const CMemDC*() /*不是重载()*/
    {
        return this;
    }
}

CMemDC iDc;
CMemDC *pDc = iDc;

论坛徽章:
0
6 [报告]
发表于 2009-05-18 08:25 |只看该作者
CMemDC const* pDc = iDc;
这么多人回复啊...

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
7 [报告]
发表于 2009-05-18 08:37 |只看该作者
原帖由 mabuc 于 2009-5-18 06:42 发表
operator HDC() const { return m_MemoryDC.m_hDC; }


CMemDC dc;

HDC hdc = dc;
FillRect(hdc, ... );

FillRect(dc, ... );


原帖由 mabuc 于 2009-5-18 06:42 发表
HDC operator ()()const { return m_MemoryDC.m_hDC; }


CMemDC dc;

HDC hdc = dc();
FillRect(hdc, ... );

FillRect(dc() , ... );

论坛徽章:
0
8 [报告]
发表于 2009-05-18 11:47 |只看该作者
原帖由 emacsnw 于 2009-5-18 08:19 发表 前者是重载operator HDC,后者是重载operator(),当然不一样啊,呵呵。


operator不是重载操作符么?HDC又不是操作符重载它干什么?

论坛徽章:
0
9 [报告]
发表于 2009-05-18 11:54 |只看该作者
原帖由 zliming 于 2009-5-18 08:23 发表
class CMemDC{
public:
operator const CMemDC*() /*不是重载()*/
    {
        return this;
    }
}

CMemDC iDc;
CMemDC *pDc = iDc;//对象等于指针,搞什么东西?晕死



不是重载,那是什么?

论坛徽章:
0
10 [报告]
发表于 2009-05-18 16:30 |只看该作者
CMemDC iDc;
CMemDC *pDc = iDc;//对象等于指针,搞什么东西?晕死

这C++世界里不要昏

struct
{
void* data;
operator int();
operator char*();
...
};
这些用法是存在的
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP