• C++ Convert Operator和其他Operator的应用场景比较


    在看lftp的源代码的时候,发现这么一行:

    operator bool() const { return ... }

    一下子没想起来,这是什么语法,是operator overload么?不像阿,怎么不以函数的返回值打头呢?后来一查C++ Primer,明白了,这是convert operator,也就是将这个类如果要转化成bool值的话,就会调用到这个函数。convert operator以operator关键字打头,紧跟类型,然后是两个括号(括号中不能带有参数)。更具体的看C++ Primer和上面的注释。

    不过看明白了之后有个问题:

    operator int() const { ...... }
    bool operator<(int input) { ...... }

    就是如果这两个operator都定义了(一个是convert op, 一个是arithmetic op),那么,在实际代码中会用到哪个呢?为此,写了一小段测试代码:

    Code: Select all
    #include <iostream>
    using namespace std;

    class A {
        public:
            operator int() const { cout << "INT Convert function called..." << endl; return content; }
            bool operator<(int input) {
                cout << "Less operator function called..." << endl;
                if (content < input)
                    return true;
                else
                    return false;
            }
           
            void setContent(int value) { content = value; }
        private:
            int content;
    };

    int main()
    {
        A a;
        a.setContent(10);
        if (a < 100)
            cout << "Class A is less than 100..." << endl;
        else
            cout << "Class A is larger than 100..." << endl;

        cout << "The abs of class A is: " << abs(a) << endl;
        return 0;
    }


    测试结论是,第一个调用:if (a < 100),调用的是arithmetic op;第二个调用abs(a),使用的是convert op。所以,现在有答案了:

    1. 当有精确匹配时,比如a < 100这种,肯定使用精确匹配。因为如果使用convert op将a变成int,然后比较的话,要经过一个convert的过程;< operator这个函数是精确匹配,所以,肯定用这个。

    2. 第二个调用无法使用arithmetic op,所以,只能用convert op,将a转化成int。在实际编码过程中,除了这种情况,还有一些情况也会用到convert op。比如,class就定义了< operator,没定义>,那么,碰到if (a > 100)这种的时候,就只能使用convert op了。

    3. 避免出现ambiguous的情况。比如,如果我们代码这样写:if (a < 100.00),那么,编译就无法通过了。因为如果使用arithmetic op,那么,需要将100.00转化成int,才满足arithmetic op的参数要求;但是如果使用convert op,也需要将生成的int转化成double,才能和100.00做比较。这样一来,编译器就无法分辨这两种方案的优先级了,自然编译就会出错了。

    OK, That's all.
  • 相关阅读:
    IP应用加速技术详解:如何提升动静混合站点的访问速率?
    阿里云PolarDB发布重大更新 支持Oracle等数据库一键迁移上云
    BigData NoSQL —— ApsaraDB HBase数据存储与分析平台概览
    洛谷P1457 城堡 The Castle
    洛谷P1461 海明码 Hamming Codes
    洛谷P1460 健康的荷斯坦奶牛 Healthy Holsteins
    洛谷P1459 三值的排序 Sorting a Three-Valued Sequence
    洛谷P1458 顺序的分数 Ordered Fractions
    洛谷P1218 [USACO1.5]特殊的质数肋骨 Superprime Rib
    洛谷P1215 [USACO1.4]母亲的牛奶 Mother's Milk
  • 原文地址:https://www.cnblogs.com/super119/p/1996147.html
Copyright © 2020-2023  润新知