【问题标题】:Typecasting from basic data type to user defined type从基本数据类型到用户定义类型的类型转换
【发布时间】:2020-02-28 04:12:59
【问题描述】:

是否可以通过重载转换运算符将基本数据类型类型转换为类类型 还是我必须在 C++ 中重载 = 运算符

说清楚

classname obj;
float f=obj;

将类型转换运算符从类重载为浮点数和

float f;
classname obj=f;

是从浮点到类的类型转换。所以我的问题基本上是后面的代码是正确的,是否可以通过重载类型转换或者我应该使用重载 = 运算符。

我知道重载 = 有效,但我只是想知道是否可以以这种方式重载类型转换运算符。

【问题讨论】:

  • 这是隐式转换。强制转换是显式转换,如static_cast<float>(obj)或(classname) f。

标签: c++ casting type-conversion operator-overloading


【解决方案1】:
classname obj;
float f=obj;

如果classname 有operator float() 是可能的,例如

class classname
{
     public:
         classname() : value(0.0f) {};
         operator float() const {return value;};
     private:
         float value;
};

同时

float f;
classname obj=f;

如果classname有一个转换构造函数是可能的,例如

class classname
{
     public:
         classname(float v) : value(x) {};
     private:
         float value;
};

如果要将现有对象分配给float,例如

float x;
classname f;
f = x;

需要赋值运算符。

class classname
{
     public:
         classname() : value(0.0f) {};
         classname &operator=(float v) {value = v; return *this;}
     private:
         float value;
};

显然,如果您想使用float 构造或分配对象,则该类必须同时具有相关的构造函数和相关的赋值运算符。

【讨论】:

  • 所以我问的是,如果我们可以明确地将 float 转换为类名
  • 您可能认为您询问了显式转换。你的帖子对我来说不是这样的。无论如何,如果一个类支持适当的转换构造函数,那么使用static_cast 的显式转换就会使用它。您可以在没有这样的构造函数的情况下使用另一个强制转换来强制转换,但是对结果对象的任何使用通常会使您陷入未定义行为的领域。因此,常见的建议 - 不要使用显式转换(C 风格或 C++ xxx_cast),除非您确切知道预期的效果是什么。而且,通常情况下,最好找到替代方案。
【解决方案2】:

classname obj=f;是初始化,那么你可以提供一个converting constructor取float来支持从float构造classname。

例如

class classname {
public:
    classname(float) { ... }
    ...
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-02
    • 1970-01-01
    • 2020-07-19
    • 2012-05-28
    • 1970-01-01
    • 2011-07-31
    相关资源
    最近更新 更多