c ++类运算符自我类型转换

时间:2011-01-17 20:28:19

标签: c++

如何在类中创建一个运算符函数,用于将其他类型作为该类的对象进行类型转换?

e.g。

class MyClass
{
  // ...
    // operator ??
  // ...
}

int main()
{
  MyClass obj;
  int Somevar;
  obj=(MyClass)Somevar; // class typecast
}

一般情况下,是否有一个运算符允许使用精确语法进行这种类型转换?

5 个答案:

答案 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)
}