Операция преобразования
Операция преобразования определяется как метод с заголовком вида:
operator другой тип();
и используется при необходимости для преобразования из определяемого типа в
другой тип.
Не следует определять одновременно операцию преобразования и обратный к ней конструктор-преобразователь.
class String {
int len;
char * str;
public:
String(const char *s=""); //
String& operator=(const String&); //
operator const char *() const { return str; } //
friend bool operator==(const String &,const String &);
...
};
int main()
{
int x;
String fmt, txt("ABC");
fmt="%d\n"; //
printf(fmt,x); //
if(fmt==txt) //
...
if(fmt=="ABC") //
//
...
}
В таких случаях не определяют операцию преобразования, вместо неё делают обычный метод:
class String {
int len;
char * str;
public:
String(const char *s=""); //
String& operator=(const String&); //
const char * c_str() const { return str; } //
friend bool operator==(const String &,const String &);
...
};
int main()
{
int x;
String fmt, txt("ABC");
fmt="%d\n"; //
printf(fmt.c_str(),x); //
if(fmt==txt) //
...
if(fmt=="ABC") //
...
}
Альтернативным вариантом исправления проблемы является указание
explicit у операций преобразования.
class String {
int len; char * str;
public:
String(const char *s=""); //
explicit operator const char *() const { return str; }
...
};
int main() {
String fmt, txt("ABC"); int x=1;
fmt="%d\n"; //
printf(fmt,x); //
printf((const char *)fmt,x); //
if(fmt==txt) //
if(fmt=="ABC") //