C ++中的运算符调用语法

时间:2012-10-29 17:55:24

标签: c++ operators comparison-operators

是否存在语法

的情况
if (first == second) // ...

与此不同?

if (first.operator==(second)) // ...

我不这么认为,但只是想知道它。

5 个答案:

答案 0 :(得分:9)

a == b

有时相当于

a.operator==(b)

有时相当于

operator==(a,b)
如果含义最终成为非类别类型的==的“内置”含义,则有时也不等于

每当编译器看到==时,如果至少有一种类型涉及用户定义的类型,它会搜索成员运算符(不得隐藏在a类类型的范围内)并且非成员运算符(使用参数依赖查找)和内置含义(因为类可能隐式转换为具有内置比较的普通类型)。如果不止一个是有意义的,那么它就符合重载决策的规则。

答案 1 :(得分:3)

如果你的意思是"两个语法何时不等同",那么答案就是等于运算符不是first类型的成员。显然,第二个变体不适用于没有成员operator==的类型。这包括内置类型。

如果成员运算符确实存在first类型,则两者不同,因为非成员运算符可以允许firstsecond的类型转换,而示例成员运营商只允许转换second

答案 2 :(得分:1)

对于两个语句具有不同效果的情况的一个例子是您有first的隐式转换。例如:

struct my_int
{
    int num;

    my_int(int num) : num(num) {}
};

bool operator==(const my_int& a, const my_int& b)
{
    return a.num == b.num;
}

在这种情况下,以下是有效的C ++代码:

my_int a(1);
int x = 1;

if (x == a) {
    std::cout << "Equal\n";
}

编译此代码的位置:

my_int a(1);
int x = 1;

if (x.operator==(a)) {
    std::cout << "Equal\n";
}

产生如下编译错误:

  

conversion.cpp:在函数'int main()'中:conversion.cpp:21:16:错误:   在'x'中请求成员'operator ==',这是非类型的   “INT”

答案 3 :(得分:0)

第二个不适用于原语。但是,这两种表单都适用于具有该运算符公开重载的自定义类型。

答案 4 :(得分:0)

如果您的问题仅基于语法,那么它取决于参数的类型。请考虑以下代码:

#include <iostream>

using namespace std;

class a {


public:

  a(){
  }

  int operator ==(const a& v){
    cout << "member operator" << endl;
    return false;
  }

};

int operator ==(a &v1, a &v2){
    cout << "external operator" << endl;
    return true;
}


int main(){

  a a1, a2;

  if (a1 == a2 && a1.operator==((const a&)a2)) {
    cout << "done" << endl;
  }

}

在此设置中,两个操作员都被调用。 如果函数类型参数相同,则似乎首选该方法。