覆盖运算符多个参数
Overriding operator multiple parameters
我一直在玩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;
计算结果为假。
希望它澄清
相关文章:
- 如何使基类的运算符对基类的可变参数数可见(请参阅下面的代码)?
- 具有两个间接寻址运算符 (C++) 的函数参数的用途
- 运算符重载:"operator+"必须采用零个或一个参数
- 为什么数组大小信息可用于"sizeof"运算符和 delete[] 运算符,但在将数组作为参数传递到
- 参数相关查找和流运算符重载
- C++:使用运算符 = 调用多参数构造函数
- 了解布尔运算符==(参数 1,参数 2)
- 我能否根据其运算符()的签名专门化可变参数模板参数
- SFINAE 检查模板参数运算符
- 不允许运算符 const 参数调用 const 成员函数
- 为私有结构定义双参数运算符重载
- C++ 通过自定义赋值运算符隐式转换函数参数
- 函数参数变量总是需要 & 或 * 运算符吗?
- 有条件地将默认参数传递给函数(使用"?"运算符)
- 可变参数模板参数转发使用逗号运算符
- C++函数,它将数组、谓词和运算符作为参数,并将运算符应用于满足谓词的数组元素
- 具有两个或多个模板参数的 C++ assigment 运算符
- 将多个参数传递给运算符 []
- 如何使用类的参数重载运算符+?
- 不允许在C++中使用多参数运算符 [] 的根本原因