zoukankan      html  css  js  c++  java
  • 类型转换重载(conversion operators)

     以前在看<windows核心编程>的时候,看到一个很奇怪的重载:operator Proc* ()

     那时对c++了解得还不多,看到这个写法费解了老半天,没有参数,没有返回值,有些析构函数的范儿。

     又带着个奇怪operator关键字,想必是做和操作符重载相关的东西。

     后面了解到,其实是用来做类型转换的,定义这个类被强制类型转换为某种类型时,所发生的行为和结果。

    class con
    {
    
      public:
        
         operator const char* () const
          {
             return "hello world";
           }
    
    }
    
    
    con var;
    
    const char* str = (const char*) var;
    
    cout << str << endl;
    
    //hello world.

     这种写法在某些情况下很有用,但一般来说,用得不多。

     我自己对这些技巧一直也没有太多兴趣,隐隐觉得,类型转换在面向对象的世界里,本就是应该规避的,这样的写法岂不相悖?

     总之不够名门正宗,不用也罢。

     前些天看到篇流传比较广的老文章:http://www.drdobbs.com/cpp/generic-change-the-way-you-write-excepti/184403758?pgno=3

     里面介绍了后面被广泛引用的ScopeGard的概念与实现。

     其中在实现对Reference的操作时写了一段这样的代码: 

    template <class T>
    class RefHolder
    {
        T& ref_;
    public:
        RefHolder(T& ref) : ref_(ref) {}
        operator T& () const
        {
            return ref_;
        }
    };
    template <class T>
    inline RefHolder<T> ByRef(T& t)
    {
        return RefHolder<T>(t);
    }

    其中这一行:operator T& () const

    让我在读代码的过程中,脑袋又卡壳了一下。忽然想起不久前,在看boost share_ptr时看到的与reference 相关的东西,囫囵吞枣,曾经十分模糊的,现在一下就亮了。到底技术在某些方面其实是殊途同归的,旁门左道的技巧,或许让人迷恋,或许让人误入岐途,就看是谁在哪种场合使用罢了 

  • 相关阅读:
    使用pthread_create时参数的传递
    借用 Google 构建自己的搜索系统
    编辑Servlet程序
    线程简单介绍
    Apache Tomcat服务器配置基础
    win2000server IIS和tomcat5多站点配置
    COmega 概述
    用Flash制作Google搜索程序
    浅析.Net下的多线程编程
    Mozilla宣布XForms开发项目 XForms是什么?它带来了什么?
  • 原文地址:https://www.cnblogs.com/catch/p/3087757.html
Copyright © 2011-2022 走看看