在 C++ 中,使用运算符强制转换可能会导致代码读者混淆,因为调用函数调用并不明显。话虽如此,我已经看到它的使用被劝阻。
但是,在什么情况下使用 operator cast 是合适的并且具有超过它可能导致的任何混淆的价值?
在 C++ 中,使用运算符强制转换可能会导致代码读者混淆,因为调用函数调用并不明显。话虽如此,我已经看到它的使用被劝阻。
但是,在什么情况下使用 operator cast 是合适的并且具有超过它可能导致的任何混淆的价值?
当转换是自然的并且没有副作用时,它会很有用。例如,没有人会争辩说从int
to的自动转换double
是不合适的,即使您可以想出一个使其混乱的极端案例(我不确定是否有人可以)。
我发现从 Microsoft 的转换CString
非常const char *
方便,即使我知道其他人不同意。我不介意在std::string
.
运算符强制转换在包装对象的 C++ 习惯用法中非常有用。例如,假设您有一些字符串类的写时复制实现。您希望您的用户能够自然地对其进行索引,例如
const String s = "abc";
assert(s[0] == 'a');
// given
char String::operator[](int) const
到目前为止,你会认为这会奏效。然而,当有人想要修改你的字符串时会发生什么?那么,也许这会起作用?
String s = "abc";
s[0] = 'z';
assert(s[0] == 'z');
// given
char & String::operator[](int)
但是这个实现给出了一个非常量字符的引用。所以有人总是可以使用该引用来修改字符串。因此,在分发引用之前,它必须在内部执行字符串的副本,这样其他字符串就不会被修改。因此,如果不强制复制,就不可能operator[]
在非常量字符串上使用。该怎么办?
您可以返回具有以下接口的包装对象,而不是返回字符引用:
类 CharRef { public: operator char() const; CharRef & operator=(char); };
char()
转换运算符只返回存储在字符串中的字符的副本。但是,当您分配给包装器时,operator=(char)
如果引用计数大于 1,它将强制字符串执行内部复制,并改为修改该副本。
例如,包装器的实现可以保存 char 和指向字符串的指针(可能是字符串实现的某个子部分)。