投与直接呼叫转换运营商?
考虑下面的类,就像一个简单的例子:
#include <iostream>
#include <string>
using namespace std;
class point {
public:
int _x{ 0 };
int _y{ 0 };
point() {}
point(int x, int y) : _x{ x }, _y{ y } {}
operator string() const
{ return '[' + to_string(_x) + ',' + to_string(_y) + ']'; }
friend ostream& operator<<(ostream& os, const point& p) {
// Which one? Why?
os << static_cast<string>(p); // Option 1
os << p.operator string(); // Option 2
return os;
}
};
应该直接调用一个转换操作符,还是只需调用static_cast
并让它完成这项工作?
这两行几乎完全相同(即调用转换操作符),就我所知,它们的行为之间并没有真正的区别。 所以这里真正的问题是这是否是真的。 尽管这些看起来与我一样,但仍然可能存在微妙的差异,人们可能无法接受。
那么这些方法(包括那些可能不适用于这个例子的方法)之间是否存在实际差异,除了它们的语法不同之外呢? 哪一个应该是首选,为什么?
那么这些方法之间是否存在实际差异?
在这种情况下,不是我所知道的,行为明智的。
(包括那些可能不适用于这个例子的)
如果X
具有类型Y
的转换构造函数, static_cast<X>(instance_of_Y)
也将允许转换。 对Y
(可能不存在)的转换运算符的显式调用无法使用所提到的转换构造函数。 当然,在这种情况下, std::string
没有针对point
的转换构造函数。
所以,演员阵容更通用,这就是我一般喜欢的。 “将此对象转换为string
类型”比“调用操作符string()
”更有意义。 但是,如果出于某种非常奇怪的原因想要避免转换构造函数,那么显式调用转换运算符将实现该功能。
不,你不需要直接调用转换操作符成员函数。
如果您使用的类的实例需要一个std::string
对象,那么转换操作符将被编译器自动调用,如果您使用static_cast
将实例转换为std::string
,那么它也会自动调用。
简单而愚蠢的例子:
void print_string(std::string const& s)
{
std::cout << s << 'n';
}
int main()
{
point p(1, 2);
print_string(p); // Will call the conversion operator
print_string(static_cast<std::string>(p)); // Will call the conversion operator too
}
直接调用函数最接近您将需要使用类似static_cast
。
在你的具体情况下,使用输出操作符,那么你应该使用static_cast
。 原因是语义上的,以及将来的读者和维护者(可能包括你自己)的代码。
它当然会直接调用转换成员函数(您的选项2),但它丢失了“在这里我将对象转换为字符串”的语义信息。
如果在输出运算符中只使用转换运算符,则最好创建一个将输出流引用作为参数的(专用)函数,并直接写入流中,然后从输出中调用该函数运营商。
链接地址: http://www.djcxy.com/p/61645.html