我试图为一个简单的类重载解引用运算符(*
)和(->
)。
class Base
{
private:
int i;
int j;
public:
Base(int i): i(i), j(i), k(90) { }
void print()
{
cout << i << j << endl;
}
Base &operator*(void)
{
cout << "inside * operator" << endl;
return *this;
}
Base *operator->(void)
{
cout << "inside -> operator" << endl;
return this;
}
};
int main()
{
Base *b = new Base(100);
int j = b->k;
int l = (*b).k;
cout << j << l<< endl;
return 0;
}
此处不会调用重载的运算符->
。但是当我使用int j = (*b)->k
时,会调用重载的运算符->
。
我不明白这是为什么会这样?而且我根本无法调用重载的operator*
。我知道我们主要为智能指针重载这些运算符,但我没有得到这里的原因。任何帮助???
答案 0 :(得分:3)
b
是一个指针。您要应用于->
的{{1}}和*
运算符取消引用指针,而不是指向它的内容。此外,该语言不允许您为指针类型重载这些运算符。
答案 1 :(得分:2)
只有在运算符的左侧是*
类型的对象时,才会使用重载的->
和Base
运算符,但在上面的示例中,左侧是左侧 - 运算符的一侧是Base*
类型的指针。要调用operator*
或operator ->
,您需要使用实际的具体Base
对象。例如:
Base b{100};
*b = ...
b->...
希望这有帮助!