2013-08-13 18 views
7

Przeszukałem go, ale nie znalazłem jednoznacznej odpowiedzi. Przykład:Co oznacza operator void *()?

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

private: 
    void *ptr; 
}; 

Rozumiem, co to jest void* operator(). Czy powyższy operator jest tą samą rzeczą w innej składni? Jeśli nie, co to jest? I jak mogę użyć tego operatora, aby uzyskać ptr?

+0

pamiętać, że aktualny kod ma literówkę, brak "opeatora" s a r – StephenTG

+0

@StephenTG Dzięki. Zmodyfikowany – GuLearn

+1

To operator obsady. http://ideone.com/k1EiJF – Chad

Odpowiedz

15

Nie są to dwa różne operatory. Funkcja operator void* jest funkcją odlewania, podczas gdy operator() jest operatorem wywołania funkcji.

Pierwsza używana jest do przekonwertowania wystąpienia Foo na void*, np.

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

Drugi służy jako funkcja:

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

Więc 'operator()' może być zaimplementowany, aby dostarczyć wywoływalne obiekty? – JAB

+0

@JAB To prawda. –

+0

Czy to umożliwi niejawną konwersję? na przykład Czy mogę bezpiecznie przekazać Foo do funkcji typu 'void bar ([anytype])' jeśli zaimplementuję 'operator [anytype]()' w Foo? – GuLearn

0

Jest to operator konwersji typów. Jest używany, gdy obiekt klasy Foo jest odlewany (konwertowany) na void*. W rzeczywistości nie jest to to samo co void* operator().

5

Ta funkcja określa, co się dzieje, gdy obiekt jest konwertowany do wskaźnika void tu ocenia na adres członu ptr punktów.

Czasami przydatne jest zdefiniowanie tej funkcji konwersji, np. do oceny boolowskiej obiektu.

Oto przykład:

#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"; 
    } 
} 

Wyjście jest:

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

Patrz także:

+0

"w przeciwnym razie byłby to adres samego obiektu, to." - Nie, nie byłoby. Myślę, że mylicie obiekt za pomocą wskaźnika do obiektu. – hvd

+0

@hvd masz rację, poprawił ten bit. – moooeeeep