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.

原文链接: https://www.cnblogs.com/super119/archive/2011/03/26/1996147.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

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

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/22852

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月8日 上午12:51
下一篇 2023年2月8日 上午12:51

相关推荐