覆盖原始数据类型的转换

Overriding conversion of primitive data types

在下面的代码中,我试图重载 int= 运算符。这样我就可以在我的程序中支持 int A= &d 语句。

class Data{
public:
    int a;
    Data(int A): a(A) {}
    operator int()  {return a;}
};

int operator=(int &lhs, Data* rhs){
    lhs = rhs->a;
    return lhs;
}

int main(){
    Data d(10);
    int A = &d;
    return 0;
}

但是编译时报错:

error: ‘int operator=(int&, Data*)’ must be a nonstatic member function int operator=(int &lhs, Data* rhs){
test1.cpp: In function ‘int main()’:
test1.cpp: error: invalid conversion from ‘Data*’ to ‘int’ [-fpermissive] int A = &d;

请建议我重载运算符的正确方法。

您不能重载对 int 的赋值。正如编译器告诉您的那样,operator= 必须是 class 的非静态成员函数,故事结束。

您已经在 class 中转换为 int,因此您可以编写 int A = d;

您的 class 中不需要赋值运算符 (operator=) 重载。而且,它不能有两个参数。

您所需要的只是转换运算符(您的 operator int() {return a;})和一个适当的赋值,例如 int A = d;。当您在 d 之前写 & 时,如果 int 足够宽以在您的系统上存储指针,则将 d 的地址放入 A