为什么运营商>重载不能在VC2010中工作?

时间:2012-06-15 16:32:08

标签: c++ operator-overloading

class A
{
public:
    A* operator->() const
    {
    }
    void Test() {}
};

然后这样称呼它。

A* a = new A;
a->Test();

代码在VC2010中成功构建并运行。这看起来很奇怪。我想知道它是设计还是VC2010的错误?

由于

2 个答案:

答案 0 :(得分:3)

您未在示例中致电operator->,而是直接从Test致电A*。你想要:

(*a)->Test();

或者...

A a;
a->Test();

关于operator->(我知道),VS2010没有任何问题。

在名为->的指针上使用a可以有效地执行:(*a).。对值变量使用->将调用operator->(如果存在),如果没有operator->则会出现语法错误。

答案 1 :(得分:1)

您的代码是:

A* a = new A;
a->Test();

“a”是指向A的指针。它不是A对象本身,它是堆上A对象的内存地址。

当你拨打a->Test()时,你会调用指针 - > operator(内置于C ++中的所有指针类型)。你必须这样做来调用你的运营商:

//Create an A (NOT a pointer).
A a;

//Invoke the A's operator ->
a->Test();

STL迭代器的工作方式 - 它们是类类型,而不是类类型的指针。注意运算符的返回类型 - >必须对你试图调用的操作/成员有意义。

所以,这是一个通过 - >:

调用test的示例
#include <iostream>

class A
{
public:
    A* operator->()
    {
        return this;
    }
    void Test() { std::cout << "Hello World!"; }
};

int main()
{
    A a;
    a->Test();
}

这很奇怪,但它有效,因为a->Test();返回当前对象,然后调用Test()(参见return this;行)。

请参阅STL迭代器,了解您实际想要执行此操作的有用示例。