2010-09-28 14 views
23

Was ist die Funktion "Operator int" unten? Was tut es?Was ist eine "Operator Int" -Funktion?

+0

Was fett Code? Ansonsten ist es im Grunde ein Wrapper für 'int' mit der Umwandlung zu' int' und dem Operator '++'. –

+3

Mit Blick auf die Quelle des ursprünglichen Beitrags soll 'operator int()' der fett gedruckte Code sein. –

+6

Wenn ich könnte, würde ich ehrlich wählen, dies wieder zu öffnen. Die ursprüngliche Frage war schlecht formatiert, aber ein Codeabschnitt war deutlich fett gedruckt. Ein späterer Schnitt (nicht vom OP) machte den Code un-fett und ließ die Frage daher inkohärent erscheinen. – eldarerathis

Antwort

24

Der fettcodierte Code ist ein Konvertierungsoperator. (AKA cast operator)

Es gibt Ihnen einen Weg aus Ihrer benutzerdefinierten INT Typ in einen anderen Typ zu konvertieren (in diesem Fall int), ohne eine spezielle Konvertierungsfunktion explizit aufrufen zu müssen.

Zum Beispiel mit dem convert-Operator, wird dieser Code kompiliert:

INT i(1234); 
int i_2 = i; // this will implicitly call INT::operator int() 

Ohne den convert-Operator, der obige Code wird nicht kompiliert, und Sie würden etwas zu tun haben, sonst von einem INT zu gehen zu einem int, wie:

INT i(1234); 
int i_2 = i.a; // this wont compile because a is private 
4

Es sieht aus wie es eine INT-Klasse machen, die sich ein wenig wie das reguläre int verhält, nur dass einige andere Operatoren noch nicht definiert sind.

Ist das ein Hausaufgabenproblem?

3

Scheint so, als wäre es eine Frage aus einem Klassenzimmer, also lade ich Sie ein, die Dokumentation zum Erstellen einer Klasse zu lesen.

class Foo 
{ 
public 
    Foo() {} // Constructor 

    Foo operator++ {} // Operation ++ on foo like: 
    // Foo foo; 
    // foo++; 
}; 
15

operator int() ist ein Umwandlungsoperator, die diese Klasse anstelle einesverwendet werden können 10. Wenn ein Objekt dieses Typs an einer Stelle verwendet wird, an der ein int (oder ein anderer numerischer Typ) erwartet wird, wird dieser Code verwendet, um einen Wert des richtigen Typs zu erhalten.

Zum Beispiel:

int i(1); 
INT I(2); // Initialised with constructor; I.a == 2 
i = I; // I is converted to an int using `operator int()`, returning 2. 
4

Das Wichtigste zuerst:

$ 12.3.1/1 - „Ein Konstruktor deklariert ohne die Funktion-specifier explizit eine Umwandlung von gibt die Arten von seine Parameter zu dem -Typ seiner Klasse. Solch ein Konstruktor wird Converting-Konstruktor genannt. "

In Ihrem Beispiel ist INT eine benutzerdefinierte Klasse, die eine Umwandlung Konstruktor von ‚int‘ hat.

Daher wird der folgende Code wohlgeformt:

INT i(1024);  // direct initialization syntax 

Das bedeutet, dass Sie ein INT-Objekt aus einer ganzen Zahl erhalten. Was macht man aber, wenn das INT-Objekt wieder in eine ganze Zahl umgewandelt werden soll? Transitivität?

Man kann sagen, dass die Klasse INT eine Member-Funktion zur Verfügung stellen kann das verkapselte integer Mitglied

int x = i.geta(); 

Dies ist jedoch nicht sehr intuitiv und ist kein Standardansatz zurückzukehren.Es ist auch nicht intuitiv, wenn es darum geht, wie eingebaute Typen in solchen Situationen funktionieren.

int z = 0; 
int y1 = z; // copy initialization or 
int y2(z); // direct initialization 
double d = (int)z; // explicit cast 

Dafür Standard ermöglicht eine solche Standardisierung und Intuitivität der mit den Worten: User Defined Types Umwandlung:

12,3/2 $ - „Eine Elementfunktion einer Klasse X keine Parameter mit einem Namen mit der Form [...]

Betreiber-ID-Typ-

[ ...] gibt eine Konvertierung von X in den Typ an, der durch die Konvertierungstyp-ID angegeben wird. Solche Funktionen sind genannte Konvertierungsfunktionen. Keine Rückgabe Typ kann angegeben werden. Wenn eine Funktion eine Elementfunktion ist, ist der Typ der Umwandlungsfunktion (8.3.5) "Funktion, die keinen Parameter übernimmt, der Konvertierungstyp-ID zurückgibt".

Dies alles macht die folgenden wohlgeformt und behält Harmonie mit der Art und Weise eingebauten Typen arbeiten ist

int y1 = i; // copy initialization or 
int y2(i); // direct initialization 
double d = (int)i; // explicit cast