2013-08-13 3 views
7

Я googled, но не нашел ясного ответа. Пример:Что означает оператор void *()?

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

private: 
    void *ptr; 
}; 

Я понимаю, что void* operator() есть. Является ли вышеуказанный оператор тем же самым в другом синтаксисе? Если нет, то что это? И как я могу использовать этот оператор для получения ptr?

+0

Обратите внимание, что ваш текущий код имеет опечатка, 'opeator' недостаток s an r – StephenTG

+0

@StephenTG Спасибо. Изменено – GuLearn

+1

Это оператор литья. http://ideone.com/k1EiJF – Chad

ответ

15

Нет, это два разных оператора. Функция operator void* является функцией литья типа, а operator() - оператор вызова функции.

Первый используется, если вы хотите преобразовать экземпляр Foo в void*, например, например.

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

Второй используется в качестве функции:

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

Итак, 'operator()' может быть реализован для предоставления вызываемых объектов? – JAB

+0

@ JAB Это правильно. –

+0

Будет ли это включать неявное преобразование? например Могу ли я безопасно передать Foo функции типа 'void bar ([anytype])', если я реализую 'operator [anytype]()' в Foo? – GuLearn

0

Это оператор преобразования типа. Он используется всякий раз, когда объект класса Foo ливается (преобразуется) в void*. Это действительно не то же самое, что и void* operator().

5

Эта функция определяет, что происходит, когда объект преобразуется в указатель недействительным, здесь он оценивает по адресу члену 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 

Смотрите также:

+0

«иначе это будет адрес самого объекта, это». Нет, это не так. Я думаю, вы путаете объект с указателем на объект. – hvd

+0

@hvd, вы правы, исправили этот бит. – moooeeeep

Смежные вопросы