覆盖运算符多个参数

时间:2017-01-13 03:51:11

标签: c++

我一直在玩C ++,发现了一些我无法解释的东西。

使用以下代码:

#include <iostream>
using namespace std;

class Foo
{
private:
    int bar;
public:  
    Foo():bar(0){}
    Foo(int a):bar(a){}
    ~Foo(){}
    int getVal() const { return bar;}
};

bool operator < (const Foo& a, const Foo& b){
    std::cout << a.getVal() << " " <<  b.getVal() << std::endl;
    return a.getVal() < b.getVal();
}

int main() {
    Foo a(12);
    Foo b(15);

    if(NULL < (a,b) ) /*  */
      std::cout << "lesser" << std::endl;
    return 0;
}

我得到这个作为输出忽略完全参数“a”但得到“b”

0 15
lesser

如果我将条件改为

a < b or operator<(a,b)

我会得到(这是所希望的行为)

12 15
lesser

我认为这可能是一些编译器的东西,但我想确定

2 个答案:

答案 0 :(得分:5)

在C ++中Transaction.by_month(2016, 'October').sum(:amount) behaves like zero。进行比较时,C ++在左侧应用User.find(2).transactions.by_month(2016, 'October').sum(:amount) 构造函数,在右侧应用comma operator以获得您看到的结果。

要禁止NULL在构造函数上转换为Foo(int)使用explicit指示符时的行为(需要C ++ 11或更高版本):

NULL

答案 1 :(得分:-3)

此代码

 if(NULL < (a,b) ) /*  */
      std::cout << "lesser" << std::endl;

有效转换为

 if(NULL < true ) /*  */
      std::cout << "lesser" << std::endl;

因为在C ++中,任何非零值都是true,所以将true视为1然后代码看起来像

if(NULL < 1 ) /*  */
      std::cout << "lesser" << std::endl;

相比之下,NULL相当于&#39; 0&#39;然后代码变成

 if(0 < 1 ) /*  */
      std::cout << "lesser" << std::endl;

这是真的。

如果函数返回falseif条件将评估为false,因为`false&#39;在C ++中为零

 if(NULL < false ) /*  */
      std::cout << "lesser" << std::endl;

变为

 if(0 < 0) ) /*  */
      std::cout << "lesser" << std::endl;

评估为false。

希望它澄清