如何在类中创建一个运算符函数,用于将其他类型作为该类的对象进行类型转换?
e.g。
class MyClass
{
// ...
// operator ??
// ...
}
int main()
{
MyClass obj;
int Somevar;
obj=(MyClass)Somevar; // class typecast
}
一般情况下,是否有一个运算符允许使用精确语法进行这种类型转换?
答案 0 :(得分:7)
只需添加一个带有一个参数的构造函数:
class MyClass {
explicit MyClass(int x) { … }
};
称为:
MyClass x = static_cast<MyClass>(10); // or
MyClass y = MyClass(10); // or even
MyClass z(10);
这允许在您的示例中进行显式转换。 (也支持C风格的演员语法,但我不会在这里显示它,因为你应该从不使用C风格的演员表。他们是邪恶的,不必要的。)
有时(但很少非常),隐式广播更合适(例如,在作业中从char*
转换为std::string
)。在这种情况下,删除构造函数前面的explicit
限定符:
class MyClass {
MyClass(int x) { … }
};
现在可以从int
进行隐式转换:
MyClass a = 10;
但是,这通常不是一个好主意,因为隐式转换不直观且容易出错,因此您通常应将构造函数标记为explicit
。
答案 1 :(得分:1)
定义一个带int
参数的构造函数。
但是隐式转换存在一些问题,很多语言都有关键字explicit
来禁止它们。
主要是关于重载解析。
所以,在允许隐式转换之前,可能要三思而后行。
干杯&amp;第h。,
答案 2 :(得分:0)
为非显式构造函数提供所需类型的参数:
class MyClass {
public:
MyClass( int x );
...
};
MyClass a = 42;
注意:这通常是一个坏主意。
答案 3 :(得分:0)
您需要隐式构造对象。
class MyClass
{
int x;
public:
MyClass(int X = 0):x(X){} //also serves a default constructor
}
int main()
{
MyClass obj = Somevar; // implicit type construction
}
答案 4 :(得分:0)
为什么不使用operator =()?
class MyClass
{
public:
Myclass& operator=()(int i) {
//do what you want
return *this;
}
}
int main()
{
MyClass obj;
int Somevar;
obj = Somevar; // call operator=(somevar)
}