作业运算符=

时间:2014-03-16 06:51:40

标签: c++ overloading

假设我有一个名为Complex的类,其中包含2个真实和图像参数。我想重载=(assignment) operator,以便我可以从真实参数中复制值并将其分配给int 如果我的主要看起来像;

Complex z(1, 2);
int a = z;

我希望a等于1。 我该如何实现这个功能/方法?

4 个答案:

答案 0 :(得分:4)

使用演员:

//Declaraion
class Complex {
  operator int();
}

//Definition
Complex::operator int() {
  return real_number;
}

Cast运算符可以隐式地将类实例转换为已定义的某个类型。它是一个方便的工具,但有时可能是危险的,易受攻击的,很难调试。

答案 1 :(得分:2)

当您定义赋值运算符时,您指示编译器在为您的类分配可能为不同类型的值时执行的操作。

在这种情况下,您希望定义在将类的实例分配给不同非类类型的变量时要执行的操作,但这是不可能的。换句话说,它是接收实例,它定义了在分配的情况下要做什么,并且您只能为类类型自定义。

非常相似的是定义一个类的实例应该如何转换为另一种类型,例如:如何将复数转换为整数,并且在转移时也将使用此转换:

 struct complex {
     double real, imag;
     ...
     operator int () const { return int(real); }
 };

答案 2 :(得分:1)

将代码读作不同等价类的类型赋值并不理想。一个人应该使用强制转换是正确的,但是必须在C ++ 11中强制转换显式

struct Complex {
     double r, i;
     ...
     explicit operator int () const { return int(r); }
 };

 Complex c = { 1.1, 2.2 };
 float a = c;        // fails with explicit
 float a = (float)c; // fails with explicit
 int a = c;          // fails with explicit
 int a = (int)c;     // compiles with explicit

答案 3 :(得分:0)

您真的需要为complex定义一个类吗?它是标准库的一部分

即使您可以看到<complex>#include <complex>)来查找重载的运算符和定义

查看更多here