2016-04-02 16 views
0

C++ 'da static_cast<Type>(object)'u öğreniyorum. Type'un kopya kurucusunu object ile buldum. Doğru mu? Eğer doğruysa, neden kopyalıyor? Sadece nesne tarafından işaret edilen belleğin nasıl kullanılacağını değiştirdiğini düşündüm. Kopya oluşturması gerekiyorsa, static_cast düşündüğümden daha fazla maliyete sahiptir. Maliyetten bakmam gerekiyor mu?Neden static_cast <Type> (object) nesneyi Type'a kopyalar?

Aşağıdakiler

#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(); 
} 

Çok teşekkür ederim, test kodu vardır.

+3

Açık olmaması durumunda, bu dökümün bulunduğu nesneyi [https://stackoverflow.com/questions/274626/what-is-object-slicing]. – WhozCraig

+2

Belleğin nasıl kullanıldığını değiştirmek isterseniz, static_cast 'kullanın. Dilimleme ile ilgili tüm yorumlar hala geçerlidir. –

+1

"Sadece nesne tarafından işaret edilen belleğin nasıl kullanılacağını değiştirdiğini düşündüm." Yanlış düşünmüşsün. Aslında, çoğu durumda, static_cast (object) ', * bazı sanal nesne' value' için 'Type value (object)' yapmak gibi * tanımlanmıştır * Tanım gereği bunu yapar. Statik_cast'in anlamı budur. – AnT

cevap

1

İşaretçilerle olduğu gibi çalışmak için static_cast beklediğiniz gibi geliyor, ancak kodunuzda hiç işaretleyici dökümü yok. static_cast<Type *>(&object), Type işaretçisini verir ve bu, Type türünde olduğu gibi object işleme koymanıza izin verir (bu, "nesne tarafından işaret edilen belleğin nasıl kullanılacağını değiştir" dediğinizde bunun demek istediğini varsayalım). Bu, object hala bellekte bir yerde özgün biçiminde bulunduğundan ve işaretçinin yalnızca object'un veri ve davranışının bir bölümüne erişim sağladığından, bu mümkündür.

Ancak açıklamalarda belirttiği gibi, static_cast<Type>(object) tip Type yeni bir nesne elde edilir - ve yeni bir nesne oluşturulur, çünkü uygun yapıcı chucked Type nesnenin içerdiği kopyalanır nesnenin bölümleri ile adlandırılır dışarı (dilimlenmiş).

+0

Jaymmer için teşekkürler. Haklısın. Tüm static_cast kullanım nesnesini bir işaretçi olarak bekledim. Yukarıdaki siz ve arkadaşlarınız sayesinde static_cast'in ne olduğunu anlıyorum. Ve istediğim şey static_cast (object). Tekrar teşekkürler. – mora

İlgili konular