C++ 静态与直接调用转换运算符?
考虑以下类,仅作为一个简单的示例:C++ 静态与直接调用转换运算符?,c++,casting,static-cast,conversion-operator,C++,Casting,Static Cast,Conversion Operator,考虑以下类,仅作为一个简单的示例: #包括 #包括 使用名称空间std; 类点{ 公众: int_x{0}; int_y{0}; 点(){} 点(intx,inty):x{x},y{y}{ 运算符字符串()常量 {返回'['+to_string(_x)+','+to_string(_y)+']'} friend ostream&operator否您永远不需要直接调用转换运算符成员函数 如果使用类的实例,其中需要std::string对象,则编译器将自动调用转换运算符,如果使用例如static\u
#包括
#包括
使用名称空间std;
类点{
公众:
int_x{0};
int_y{0};
点(){}
点(intx,inty):x{x},y{y}{
运算符字符串()常量
{返回'['+to_string(_x)+','+to_string(_y)+']'}
friend ostream&operator否您永远不需要直接调用转换运算符成员函数
如果使用类的实例,其中需要std::string
对象,则编译器将自动调用转换运算符,如果使用例如static\u 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
}
void打印字符串(std::string const&s)
{
标准::cout
那么,这些方法之间是否存在实际差异
就我所知,在这种情况下,行为是明智的
(包括可能不适用于本示例的内容)
如果X
具有类型Y
的转换构造函数,则静态\u转换(Y的实例)
也将允许转换。显式调用(可能不存在)Y
的转换运算符无法使用提到的转换构造函数。当然,在这种情况下,std::string
没有用于点的转换构造函数
因此,强制转换更为通用,这也是我通常喜欢的。另外,“将此对象转换为类型字符串
”比“调用操作符字符串()
”更有意义。但是如果出于某种非常奇怪的原因,您希望避免转换构造函数,那么显式调用转换操作符将实现这一点“从不”-基于什么?转换构造函数的优点,没想到。