9

我用谷歌搜索,但没有找到明确的答案。例子:

class Foo {
public:
    operator void* () {
         return ptr;
    }

private:
    void *ptr;
};

我明白是什么void* operator()。上面的操作符在不同的语法中是一样的吗?如果不是,那是什么?以及如何使用该运算符来获取ptr

4

3 回答 3

15

不,他们是两个不同的运营商。该operator void*函数是一个类型转换函数,whileoperator()是一个函数调用运算符。

第一个用于将 的实例转换Foo为 a时使用void*,例如

Foo foo;
void* ptr = foo;  // The compiler will call `operator void*` here

第二个用作函数:

Foo foo;
void* ptr = foo();  // The compiler calls `operator()` here
于 2013-08-13T17:49:11.133 回答
5

该函数定义了当对象转换为 void 指针时会发生什么,这里它计算成员ptr指向的地址。

定义此转换函数有时很有用,例如,用于对象的布尔评估。

这是一个例子:

#include <iostream>

struct Foo {
    Foo() : ptr(0) {
        std::cout << "I'm this: " << this << "\n";
    }
    operator void* () {
        std::cout << "Here, I look like this: " << ptr << "\n";
        return ptr;
    }
private:
    void *ptr;
};

int main() {
    Foo foo;
    // convert to void*
    (void*)foo;
    // as in:
    if (foo) { // boolean evaluation using the void* conversion
        std::cout << "test succeeded\n";
    }
    else {
        std::cout << "test failed\n";
    }
}

输出是:

$ g++ test.cc && ./a.out
I'm this: 0x7fff6072a540
Here, I look like this: 0
Here, I look like this: 0
test failed

也可以看看:

于 2013-08-13T17:49:26.043 回答
1

它是一个类型转换运算符。每当类的对象Foo被强制转换(转换)为void*. 确实不一样void* operator()

于 2013-08-13T17:49:01.630 回答