2013-08-13 34 views
7

Ich googelte, fand aber keine klare Antwort. Beispiel:Was bedeutet Operator void *()?

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

private: 
    void *ptr; 
}; 

Ich verstehe was void* operator() ist. Ist der obige Operator in einer anderen Syntax identisch? Wenn nicht, was ist es? Und wie kann ich diesen Operator verwenden, um die ptr zu bekommen?

+0

Beachten Sie, dass Ihre aktuellen Code ein Tippfehler, "opeator" fehlt s an r – StephenTG

+0

@StephenTG Danke. Geändert – GuLearn

+1

Es ist ein Cast-Operator. http://ideone.com/k1EiJF – Chad

Antwort

15

Nein, sie sind zwei verschiedene Operatoren. Die operator void*-Funktion ist eine Typ-Casting-Funktion, während operator() ein Funktionsaufruf-Operator ist.

Die erste wird verwendet, wenn Sie eine Instanz von Foo zu einem void*, wie zum Beispiel konvertieren möchten

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

Die zweite als Funktion verwendet wird:

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

Also kann 'operator()' implementiert werden, um aufrufbare Objekte bereitzustellen? – JAB

+0

@ JAB Das ist richtig. –

+0

Wird die implizite Konvertierung aktiviert? z.B. Kann ich Foo sicher an eine Funktion wie 'void bar ([anytype]) 'übergeben, wenn ich' operator [anytype]() 'in Foo implementiere? – GuLearn

0

Es ist eine Typumwandlung Operator. Es wird verwendet, wenn ein Objekt der Klasse Foo gegossen wird (umgerechnet) zu void*. Es ist in der Tat nicht das gleiche wie void* operator().

5

Diese Funktion legt fest, was passiert, wenn das Objekt in einen void-Zeiger umgewandelt wird, hier wertet sie an die Adresse dem Mitglied ptr Punkte.

Es ist manchmal nützlich, diese Umwandlungsfunktion zu definieren, z.B. für boolsche Bewertung des Objekts.

Hier ist ein Beispiel:

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

Die Ausgabe lautet: auch

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

See:

+0

"Sonst wäre es die Adresse des Objekts selbst." - Nein, würde es nicht. Ich denke, Sie verwechseln das Objekt mit einem Zeiger auf das Objekt. – hvd

+0

@hvd du hast Recht, dieses Bit korrigiert. – moooeeeep