2016-04-02 4 views
0

Ich lerne static_cast<Type>(object) in C++. Ich fand es ruft Kopie Konstruktor von Type mit object. Ist das wahr? Wenn es wahr ist, warum es es kopiert? Ich dachte, es würde nur ändern, wie man den Speicher verwendet, auf den das Objekt zeigt. Wenn es benötigt wird, Kopie zu konstruieren, hat static_cast mehr Kosten, als ich dachte. Muss ich mich um die Kosten kümmern?Warum static_cast <Type> (Objekt) kopiert Objekt in Type?

Die folgenden sind die Code-Test,

#include <iostream> 

class Base { 
public: 
    Base() {}; 
    Base(const Base& org) { 
     std::cout << "Base Copy Constructor" << std::endl; 
    }; 
    virtual ~Base() {}; 
}; 

class Derived : public Base { 
public: 
    void static_casting(void) { 
     static_cast<Base>(*this); 
    } 
}; 

void test_static_cast_copy_constructor(void) { 
    Derived a; 
    a.static_casting(); 
} 

Ihnen sehr danken.

+3

Falls es nicht offensichtlich war, [Sie ** schnitzen **] (https://Stackoverflow.com/questions/274626/what-is-object-slicing) das Objekt mit dieser Besetzung. – WhozCraig

+2

Wenn Sie ändern möchten, wie der Speicher verwendet wird, verwenden Sie 'static_cast '. Alle Bemerkungen zum Slicen gelten weiterhin. –

+1

"Ich dachte, es würde nur ändern, wie der Speicher verwendet wird, auf den das Objekt zeigt." Du hast falsch gedacht. In der Tat ist 'static_cast (Objekt)' in den meisten Fällen * so definiert, als würde man 'Type value (object)' für ein imaginäres Objekt 'value' machen. Das will es per Definition. Dafür ist 'static_cast' gedacht. – AnT

Antwort

1

Es klingt wie Sie erwarten, dass static_cast funktioniert wie es mit Zeigern funktioniert, aber es gibt kein Pointer-Casting in Ihrem Code. static_cast<Type *>(&object) würde einen Zeiger auf Type ergeben, und Dereferenzierung würde es tatsächlich object behandeln lassen, als wäre es vom Typ Type (ich nehme an, das ist, was du meinst, wenn du sagst "ändern, wie man den Speicher verwendet, der auf das Objekt zeigt"). Dies ist möglich, weil object immer noch in seiner ursprünglichen Form irgendwo im Speicher existiert und der Zeiger in Wirklichkeit nur Zugriff auf einen Teil der Daten und des Verhaltens von object bietet.

jedoch, wie in den Kommentaren darauf hingewiesen, static_cast<Type>(object) ergibt sich ein neues Objekt vom Typ Type - und da ein neues Objekt erstellt wird, wird der entsprechende Konstruktor aufgerufen, mit den Teilen des kopierten Objekt nicht in einem Type Objekt enthalten geschmissen aus (in Scheiben geschnitten).

+0

Danke für Jaymmer. Du hast recht. Ich erwartete alle static_cast verwenden Objekt als Zeiger. Dank dir und den Leuten oben verstehe ich, was static_cast ist. Und was ich wollte, ist static_cast (Objekt). Danke nochmal. – mora

Verwandte Themen