Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 运算符void*()是什么意思?_C++ - Fatal编程技术网

C++ 运算符void*()是什么意思?

C++ 运算符void*()是什么意思?,c++,C++,我在谷歌上搜索了一下,但没有找到明确的答案。例如: class Foo { public: operator void* () { return ptr; } private: void *ptr; }; 我理解什么是void*operator()。上面的运算符在不同的语法中是相同的吗?如果没有,是什么?我如何使用该操作符来获取ptr?它是一个类型转换操作符。每当类Foo的对象被强制转换(转换)为void*时,就会使用它。它确实不同于void*操作符

我在谷歌上搜索了一下,但没有找到明确的答案。例如:

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

private:
    void *ptr;
};

我理解什么是
void*operator()
。上面的运算符在不同的语法中是相同的吗?如果没有,是什么?我如何使用该操作符来获取
ptr

它是一个类型转换操作符。每当类
Foo
的对象被强制转换(转换)为
void*
时,就会使用它。它确实不同于
void*操作符()

不,它们是两个不同的操作符。
操作符void*
函数是类型转换函数,而
操作符()
是函数调用操作符

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

Foo foo;
void* ptr = foo;  // The compiler will call `operator void*` here
第二个用作函数:

Foo foo;
void* ptr = foo();  // The compiler calls `operator()` here

该函数定义了当对象转换为空指针时发生的情况,在这里它计算为成员
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";
    }
}
另见:


请注意,您当前的代码有输入错误,
opeator
缺少r@StephenTG谢谢ModifiedIt是一个cast操作符@Chad-这是一个转换运算符。有些转换是通过强制转换完成的,有些不是。这可能是对安全布尔习惯用法的一种尝试。请参见So
operator()
可以实现以提供可调用对象?这会启用隐式转换吗?e、 g.如果我在Foo?@YZ.learner中实现了
操作符[anytype]()
,那么我可以安全地将Foo传递给像
void bar([anytype])
这样的函数吗?除了规范中的隐式转换(比如
short
int
等),您还可以通过两种方式获得隐式转换:通过“目的地”类包含一个采用“source”类型的非显式构造函数,或者通过像您的示例中那样的强制转换运算符。“否则它将是对象本身的地址,这个。”--不,它不会。我想你把这个对象和指向这个对象的指针混淆了。
$ g++ test.cc && ./a.out
I'm this: 0x7fff6072a540
Here, I look like this: 0
Here, I look like this: 0
test failed