我用谷歌搜索,但没有找到明确的答案。例子:
class Foo {
public:
operator void* () {
return ptr;
}
private:
void *ptr;
};
我明白是什么void* operator()
。上面的操作符在不同的语法中是一样的吗?如果不是,那是什么?以及如何使用该运算符来获取ptr
?
我用谷歌搜索,但没有找到明确的答案。例子:
class Foo {
public:
operator void* () {
return ptr;
}
private:
void *ptr;
};
我明白是什么void* operator()
。上面的操作符在不同的语法中是一样的吗?如果不是,那是什么?以及如何使用该运算符来获取ptr
?
不,他们是两个不同的运营商。该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
该函数定义了当对象转换为 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
也可以看看:
它是一个类型转换运算符。每当类的对象Foo
被强制转换(转换)为void*
. 确实不一样void* operator()
。