kva*_*nck 3 c++ operators conversion-operator implicit-conversion explicit-conversion
我正在写一个String类.我希望能够分配我的字符串,如;
a = "foo";
printf(a);
a = "123";
printf(a);
int n = a; // notice str -> int conversion
a = 456; // notice int -> str conversion
printf(a);
Run Code Online (Sandbox Code Playgroud)
我已经为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);
//}
Run Code Online (Sandbox Code Playgroud)
甲单参数的构造可以作为内部- >字符串转换,而一个所谓的转换运算符做相反的内部- >字符串
class String
{
public:
String(int) {} // initialization of String with int
String& operator=(int) {} // assignment of int to String
operator int() const {} // String to int
};
Run Code Online (Sandbox Code Playgroud)
但请注意,这些转换会隐式发生,您很容易被咬伤.假设您将此类扩展为也接受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
};
Run Code Online (Sandbox Code Playgroud)
你会有这两个函数重载
void fun(int) { // bla }
void fun(std::string) { // bla }
Run Code Online (Sandbox Code Playgroud)
现在试着打电话fun(String()).您会收到编译错误,因为存在多个可靠的隐式转换.这就是为什么C++ 98允许explicit单参数构造函数前面的关键字,而C++ 11将它扩展到explicit转换运算符.
所以你会写:
class String
{
public:
explicit String(int) {} // int to String
explicit operator int() const {} // String to int
};
Run Code Online (Sandbox Code Playgroud)
一个例子隐式转换可能是legitate对于希望转换为智能指针类bool的或者(如果它们模板)smart_pointer<Derived>来smart_pointer<Base>.
| 归档时间: |
|
| 查看次数: |
1848 次 |
| 最近记录: |