我正在写一个String类.我希望能够分配我的字符串,如;
a = "foo"; printf(a); a = "123"; printf(a); int n = a; // notice str -> int conversion a = 456; // notice int -> str conversion printf(a);
我已经为string到整数转换分配了operator =()方法.如何声明另一个operator =()以便我可以执行反向方法?
String::operator const char *() { return cpstringBuffer; } String::operator const int() { return atoi(cpstringBuffer); } void String::operator=(const char* s) { ResizeBuffer(strlen(s)); strcpy(cpstringBuffer,s); } bool String::operator==(const char* s) { return (strcmp(cpstringBuffer,s) != 0); } //void String::operator=(int n) { // char _cBuffer[33]; // char* s = itoa(n,_cBuffer,10); // ResizeBuffer(strlen(_cBuffer)); // strcpy(cpstringBuffer,_cBuffer); //}
解决方法
单参数构造函数可以充当int-> String转换,而所谓的转换运算符可以反转int-> String
class String { public: String(int) {} // initialization of String with int String& operator=(int) {} // assignment of int to String operator int() const {} // String to int };
但请注意,这些转换会隐式发生,您很容易被咬伤.假设您将扩展此类以接受std :: string参数和转换
class String { public: String(int) {} // int to String String(std::string) {} // std::string to String // plus two assignment operators operator int() const {} // String to int operator std::string const {} // String to std::string };
你会有这两个函数重载
void fun(int) { // bla } void fun(std::string) { // bla }
现在尝试调用fun(String()).您会收到编译错误,因为存在多个可靠的隐式转换.这就是为什么C 98允许在单参数构造函数前显式关键字,而C 11将它扩展到显式转换运算符.
所以你会写:
class String { public: explicit String(int) {} // int to String explicit operator int() const {} // String to int };
隐式转换可能合法的一个示例是希望从smart_pointer< Derived>转换为bool或(如果它们是模板化的)智能指针类.到smart_pointer< Base>.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。