我认为这应该是微不足道的:
我写了一个类来处理二进制编码的十进制(BCD)8位值 该类有像set(),get(),add(),sub()等的方法。完美的工作 get()的示例:
class bcd8_t {
public:
uint8_t get() { return value_u8; }
private:
uint8_t value_u8;
};
现在我想将此类转换为新的数据类型。我基本上想要替换像
这样的东西bcd8_t a;
uint8_t b = a.get();
类似
bcd8_t a;
uint8_t b = (uint8_t)a;
所以我希望我能写一个重载的“=”运算符,它返回一个uint8_t,如:
class bcd8_t {
public:
uint8_t operator=() { return value_u8; }
private:
uint8_t value_u8;
};
然而,我曾经尝试过的编译器告诉我
cannot convert 'bcd8_t' to 'uint8_t'
或
invalid cast from type 'bcd8_t' to type 'uint8_t'
怎么做?
答案 0 :(得分:5)
赋值运算符是将指定给你的类。
要转换类的对象,您需要实现一个类型转换操作符:
class bcd8_t {
public:
...
operator uint8_t() const { return value_u8; }
...
};
对于你实现为成员函数的所有二元运算符(使用二元运算符,我指的是那些带有两个操作数的运算符,例如赋值,比较,加法等),那么你的类的对象总是操作员的左侧。
让我们以赋值运算符为例。如果你在类中重载赋值运算符并执行类似
的操作bcd8_t a;
any_type b;
...
a = b;
然后编译器将赋值转换为
a.operator=(b);
对于作为成员函数重载的所有运算符都是一样的。
此外,某些运算符(包括赋值运算符)只能 实现为成员函数。你不能让赋值运算符的非成员函数重载,这是不允许的。
参见例如this operator overloading reference了解更多信息。