C++ 运算符==如何在C++;

C++ 运算符==如何在C++;,c++,class,operator-overloading,C++,Class,Operator Overloading,我正在读书,偶然发现了一些我以前不知道的东西。基本上,它说我可以在一个类之外重载,即操作符==,它将以某种方式用于比较这个类的两个对象。我做到了: #include <iostream> class foo { public: int member; foo() : member(0) {} }; bool operator==(const foo& lhs, const foo& rhs) { return lhs.member == r

我正在读书,偶然发现了一些我以前不知道的东西。基本上,它说我可以在一个类之外重载,即
操作符==
,它将以某种方式用于比较这个类的两个对象。我做到了:

#include <iostream>

class foo
{
public:
    int member;
    foo() : member(0) {}
};

bool operator==(const foo& lhs, const foo& rhs)
{
    return lhs.member == rhs.member;
}

int main()
{
    foo c1;
    foo c2;
    if (c1 == c2)
    {
        std::cout << "Even" << '\n';
    }   
}
#包括
福班
{
公众:
国际会员;
foo():成员(0){}
};
布尔运算符==(常数foo和lhs、常数foo和rhs)
{
返回lhs.member==rhs.member;
}
int main()
{
foo c1;
foo c2;
如果(c1==c2)
{

std::cout假设你有一个函数
bool is_equals(const foo&lhs,const foo&rhs);
。编译器如何将
is_equals(c1,c2)
转换为调用
is_equals

答案与
运算符==
的答案完全相同。当操作数类型没有成员
运算符==
时,编译器尝试使用操作数类型查找非成员
运算符==
。如果存在这样的对象,则会调用它,如果不存在,则不会调用它

如果您的非成员
运算符==
重载位于不同的文件中,并且当前正在编译的文件中没有头声明它,那么编译器将如何运行?答案与以前相同:如果您调用
is_等于
而不声明这样的函数存在,会发生什么

您会得到一个编译错误。该函数是否在另一个翻译单元中定义并不重要;如果在您尝试调用该函数时没有可见的声明,则会得到一个编译错误

如果两个单独的文件试图用不同的实现来定义<代码>运算符==/C++ >同样的事情:如果你尝试用“代码> iSySudio< <代码> >来做同样的事情。你将违反C++的一个定义规则,从而调用了未定义的行为。你希望得到链接错误,但是没有保证。f那


简而言之,<代码>运算符==/COD> C++不是一个特殊的神奇函数。它对于函数来说是个不寻常的名字,但是对于编译器或链接器来说,它并不是什么特别的东西,特别的是,<代码> C1=C2< /Cord>被转换成一个调用:“代码>运算符==(C1,C2)< /C>(BTW是100%合法的C++代码,你可以写,虽然它只调用非成员<代码>运算符==/COD>)。但是这是使用操作符的特殊的,不是C++函数语法的。

我们假设你有一个函数:代码>布尔OISIAL(confo and LHS,const fo& rh);< /Cord>。(c1,c2)

调用
是否等于

答案与
运算符==
的答案完全相同。当操作数类型没有成员
运算符==
时,编译器尝试使用操作数类型查找非成员
运算符==
。如果存在这样的对象,则会调用它,如果不存在,则不会调用它

如果您的非成员
运算符==
重载位于不同的文件中,并且当前正在编译的文件中没有头声明它,那么编译器将如何运行?答案与以前相同:如果您调用
is_等于
而不声明这样的函数存在,会发生什么

您会得到一个编译错误。该函数是否在另一个翻译单元中定义并不重要;如果在您尝试调用该函数时没有可见的声明,则会得到一个编译错误

如果两个单独的文件试图用不同的实现来定义<代码>运算符==/C++ >同样的事情:如果你尝试用“代码> iSySudio< <代码> >来做同样的事情。你将违反C++的一个定义规则,从而调用了未定义的行为。你希望得到链接错误,但是没有保证。f那


简而言之,<代码>运算符==/COD> C++不是一个特殊的神奇函数。它对于函数来说是个不寻常的名字,但是对于编译器或链接器来说,它并不是什么特别的东西,特别的是,<代码> C1=C2< /Cord>被转换成一个调用:“代码>运算符==(C1,C2)< /C>(BTW是100%合法的C++代码,你可以写,虽然它只调用非成员<代码>运算符==/COD>),但是这是使用操作符的特殊之处,而不是C++函数语法。

当你有一个关于C++的问题时,最糟糕的地方是“在互联网上解释”。一个好的C++书籍是一个更好的选择。该胶囊摘要是:编译器“通过声明它来找到这个函数”,链接器“查找这个函数”与找到其他链接的函数没有什么不同。好的,但是我想,如果涉及到类,它会寻找一个成员函数(一个方法)。如果不是运算符没有作为类成员重载,则在全局范围内检查重载运算符。接下来,有许多规则,包括依赖于参数的查找,用于搜索适当的运算符重载或函数。C++。很复杂。好了,现在我明白了,谢谢你,当你有一个关于C++的问题时,最糟糕的地方就是“互联网上的解释”。一本好的C++书籍是一个更好的选择。和它找到任何其他函数链接在一起没有什么不同。好吧,但我认为,如果涉及到类,它会寻找一个成员函数(一个方法)如果不是运算符没有作为类成员重载,则在全局范围内检查重载运算符。接下来,有许多规则,包括依赖于参数的查找,用于搜索适当的运算符重载或函数。C++。是