为什么下面没有调用重载的运算符==(const String&,const String&)? “cobble”==“stone”

时间:2010-04-22 12:31:24

标签: c++

为什么以下内容不会调用重载的operator== (const String &, const String &)

"cobble" == "stone"

4 个答案:

答案 0 :(得分:13)

因为在C ++中,字符串文字的类型为const char[](也称为以零结尾的字符串常量),而不是std::string,更不用说String(无论是什么)。<登记/> 有一个内置operator==比较两个char*比较他们的地址。由于数组可以隐式转换为指向它们的第一个元素的指针(由于,你猜对了,C传承),这个运算符会介入,你比较的是这些文字在内存中的地址。

假设您的String类具有来自const char*String::String(const char*))的隐式转化构造函数,您可以将其中一个转换为String。然后隐式转换另一个字符串:

String("cobble") == "stone"

(除非提供operator== Stringconst char*的重载是为了提高效率。如果提供了超载,则会介入。)

答案 1 :(得分:6)

因为隐式存在的operator==(char*, char*)更符合您对==的使用。

代码==中的运营商"cobble" == "stone"可以通过不同方式进行匹配:operator==(char[], const String&)operator==(const String&, String)operator==(const String&, const std::string&)等,前提是来自参数类型(char*)与参数类型(String*等)存在。但是,通常的char*比较与输入最佳匹配。

答案 2 :(得分:5)

因为这些是C中的简单字符序列,但没有string类的实例。

答案 3 :(得分:1)

"cobble"被解释为char*,编译器使用指针比较来比较char*。如果要比较字符串的内容,请使用

std::string("cobble") == std::string("stone")
相反,编译器将使用operator== (const std::string &, const std::string &)