zoukankan      html  css  js  c++  java
  • C++ 中operator用法:隐式类型转换

    【转】C++ operator两种用法

    C++,有时它的确是个耐玩的东东,就比如operator,它有两种用法,一种是operator overloading(操作符重载),一种是operator casting(操作隐式转换)。

    1、操作符重载
    C++可以通过operator实现重载操作符,格式如下:类型T operator 操作符 (),比如重载+,比如下面这个例子
    template<typename T> class A
    {
    public:
         const T operator+(const T& rhs)
         {
             return this->m_ + rhs;
         }
    private:
         T m_;
    };

    又比如STL中的函数对象,重载(),比如下面这个例子
    template<typename T> struct A
    {
       T operator()(const T& lhs, const T& rhs){ return lhs-rhs; }
    };


    2、 操作隐式转换
    C++可以通过operator实现重载隐式转换,格式如下: operator T (),其中T是一个类型,比如下面这个例子
    class A
    {
    public:
       operator   B*() { return this->b_; }
       operator const   B*() { return this->b_; }
       operator   B&() { return *this->b_; }
    private:
       B* b_;
    };

    A a;
    当if(a),编译时,它转换成if(a.operator B*()),其实也就是相当于 if(a.b_)
     
     
     

    C++ 中operator用法:隐式类型转换

    分类: CC++ 122人阅读 评论(0) 收藏 举报

    C++中的operator主要有两个作用,一是操作符的重载,一是操作符的转换。对于操作符的重载,许多人都不陌生,用以下这个小例子温故一下:

    1. class A  
    2. {  
    3.     public:  
    4.     A operator +(A& oa){A a;a.num=oa.num+num;return a;}  
    5.     int num;  
    6. };  
    7.   
    8. int main(int argc,char* argv[])  
    9. {  
    10.     A a; a.num=1;  
    11.     A b; b.num=2;  
    12.     A c;  
    13.     c=a+b;  
    14.     cout<<"c.num: "<<c.num<<endl;  
    15. }  
    16. 程序输出为:c.num: 3;  
    很简单,也很容易理解。下面有必要系统说下operator算子的另一大功能 操作符的转换:operator T

    语法很简单,在类的成员函数声明部分作出声明即可:

    1. class A {  
    2. public:  
    3.     ......  
    4.     operator int(){return num;};  // 在需要情况下, A对象可以转成int类型对象。  
    5.     ......  
    6.     int num;  
    7.  };  
    这条声明使得以下语句成立:
    1. cout<<c+12<<endl; //其中c是A类型的对象  

    又发生了隐式的类型转换,这一次,我们可以直接用类的对象去生成一个其他的类型,是不是想到了构造函数的隐式类型转换部分呢?下面我们就来做一个小小的总结:

    构造函数的隐式类型转换部分,使用一个其他的类型构造当前类的临时对象,这种转换必须有构造函数的支持;operator算子的隐式类型转换,使用当前对象去生成另一个类型的对象(正好与构造函数型相反),这种转换必须有operator算子的支持。

    隐式的类型转换有利有弊,类的设计者就起决定性作用了,如果你不想让构造函数发生隐式的类型转换,请在构造函数前加explicit关键字;同时,operator算子声明的隐式类型转换也可以通过一些相应的返回值函数替代,用户的掌控性更好。

    建议参考阅读本博客隐式类类型转换一文。


  • 相关阅读:
    CodeForces 510C Fox And Names (拓扑排序)
    Codeforces 1153D Serval and Rooted Tree (简单树形DP)
    HDU 6437 Problem L.Videos (最大费用)【费用流】
    Luogu P3381 (模板题) 最小费用最大流
    Codeforces 741B Arpa's weak amphitheater and Mehrdad's valuable Hoses (并查集+分组背包)
    Codeforces 1144F Graph Without Long Directed Paths (DFS染色+构造)
    HDU 2204 Eddy's 爱好 (容斥原理)
    Codeforces 939E Maximize! (三分 || 尺取)
    Codeforces 938D. Buy a Ticket (最短路+建图)
    CodeForces 959E Mahmoud and Ehab and the xor-MST (MST+找规律)
  • 原文地址:https://www.cnblogs.com/jeanschen/p/3227385.html
Copyright © 2011-2022 走看看