开发者

Why does the following not invoke the overloaded operator== (const String &, const String &)? "cobble" == "stone"

Why doe开发者_开发问答s the following not invoke the overloaded operator== (const String &, const String &)?

"cobble" == "stone"


Because in C++, string literals are of the type const char[] (also called a zero-terminated string constant), not std::string, let alone String (whatever that is).
There's a built-in operator== comparing two char* by comparing their addresses. Since arrays are implicitly convertible into pointers to their first elements (due, you guessed right, the C heritage), this operator steps in and what you compare are the addresses of these literals in memory.

Supposing your String class has an implicit conversion constructor from const char* (String::String(const char*)), you could convert one of the two to String. The other string would then be converted implicitly:

String("cobble") == "stone"

(Unless overloads of operator== taking a String and a const char* are provided for efficiency. If they are provided, they step in.)


Because implicitly existing operator==(char*, char*) matches your usage of == better.

The operator == in code "cobble" == "stone" can be matched in different ways: operator==(char[], const String&), operator==(const String&, String), operator==(const String&, const std::string&) etc., provided that the conversion from the parameter type (char*) to the type of arguments (String*, etc.) exists. However the usual char* comparison matches the input best of all.


Because those are simple sequences of characters as in C but no instances of the string class.


"cobble" ist interpreted as a char*, and the compiler uses pointer comparison to compare char*. If you want to compare the contents of the strings, use

std::string("cobble") == std::string("stone")

instead, and the compiler will use operator== (const std::string &, const std::string &).

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜