覆盖运算符多个参数

Overriding operator multiple parameters

本文关键字:参数 运算符 覆盖      更新时间:2023-10-16

我一直在玩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

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

In C++ NULL的行为像零。当您进行比较时,C++在左侧应用构造函数Foo(int)在右侧应用逗号运算符,以得出您看到的结果。

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

explicit Foo(int a):bar(a){}

此代码

 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 相当于"0",然后代码变为

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

这是真的。

如果函数返回 false ,则if条件的计算结果为 false,因为 'false' 在C++

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

成为

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

计算结果为假。

希望它澄清