1

在 C++ 中,使用运算符强制转换可能会导致代码读者混淆,因为调用函数调用并不明显。话虽如此,我已经看到它的使用被劝阻。

但是,在什么情况下使用 operator cast 是合适的并且具有超过它可能导致的任何混淆的价值?

4

2 回答 2

1

当转换是自然的并且没有副作用时,它会很有用。例如,没有人会争辩说从intto的自动转换double是不合适的,即使您可以想出一个使其混乱的极端案例(我不确定是否有人可以)。

我发现从 Microsoft 的转换CString非常const char *方便,即使我知道其他人不同意。我不介意在std::string.

于 2012-06-06T20:56:07.627 回答
1

运算符强制转换在包装对象的 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 和指向字符串的指针(可能是字符串实现的某个子部分)。

于 2012-06-07T00:17:21.723 回答