为什么以下内容不会调用重载的operator== (const String &, const String &)
?
"cobble" == "stone"
答案 0 :(得分:13)
因为在C ++中,字符串文字的类型为const char[]
(也称为以零结尾的字符串常量),而不是std::string
,更不用说String
(无论是什么)。<登记/>
有一个内置operator==
比较两个char*
比较他们的地址。由于数组可以隐式转换为指向它们的第一个元素的指针(由于,你猜对了,C传承),这个运算符会介入,你比较的是这些文字在内存中的地址。
假设您的String
类具有来自const char*
(String::String(const char*)
)的隐式转化构造函数,您可以将其中一个转换为String
。然后隐式转换另一个字符串:
String("cobble") == "stone"
(除非提供operator==
String
和const 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 &)
。