Belirli bir static_cast'in bir sınıfın yapıcısını çağıracak olup olmadığını belirleme kuralları nelerdir? C stili/fonksiyonel stil atmalarına ne dersiniz? Uygun bir dönüşüm dönüşüm yapıcısı static_cast
tarafından çağrılır kurucu varsaYayınlar, yeni türün yapıcısını ne zaman arar?
cevap
Yeni bir nesne oluşturulduğunda, bir kurucu çağrılır. static_cast
, her zaman numaralı ya da kullanıcı tanımlı bir dönüşüme yapılan bir çağrı aracılığıyla yeni, geçici bir nesneye (ancak James McNellis'in yorumuna bakın) neden olur. (Fakat dönmek için istenen tipte bir nesne olması için, kullanıcı dönüşüm operatör bir kurucu aramak zorunda tanımlanmış olur.)
Tek bir argüman ile tanım olarak static_cast
ile aynıdır. Fonksiyonel stilin sıfır veya sıfırdan fazla bir argümanı varsa, o zaman derhal yapıcıyı çağırır; Kullanıcı tanımlı dönüşüm operatörleri bu durumda dikkate alınmaz. (Ve kimse olabilir soru bu a "tipi dönüşüm" çağıran bir seçim.) Kayıt, bir kullanıcı tanımlı dönüşüm operatörü denilebilir bir vaka için
:
class A
{
int m_value;
public
A(int initialValue) : m_value(initialValue) {}
};
class B
{
int m_value;
public:
B(int initialValue) : m_value(initialValue) {}
operator A() const { return A(m_value); }
};
void f(A const& arg);
B someB;
f(static_cast<A>(arg));
Bu özel durumda , döküm gereksizdir ve dönüşümünün olmaması durumunda örtülü olarak yapılacaktır. Ama her durumda: Örtülü dönüşüm, static_cast
, C tarzı dökme ((A) someB
) ya da fonksiyonel stil döküm (A(someB)
), B::operator A()
adı verilecek)
: "işlevsel" Aynı C-tarzı için geçerlidir
class Class {
public:
Class(int); //<< conversion constructor
};
int what = 0;
Class object = static_cast<Class>(what);
atmalarını ve atmalarını.
int what = 0;
Class object = (Class)what;
int what = 0;
Class object = Class(what);
Ne yapıcı müstehcen olup olmadığı hakkında.? Hala çağrılacağını varsayardım. – Mankarse
@Mankarse: Evet, 'açık', türü belirtmeden çağrılmayacağı anlamına gelir. Türü belirttiğinizde çağrılacak. – sharptooth
Bu tür yeni bir örnek oluşturulduğunda, sınıf türü için bir kurucu çağrılır. Bir yayın bu sınıf türünde yeni bir nesne oluşturuyorsa, bir kurucu çağrılır. Aşırı yük çözünürlüğü, sınıf türü için kuruculardan hangisinin belirli argümanlar verildiğini belirler.
static_cast
hedef türü bir sınıf tipi ise, hedef türünün yeni bir nesnesini oluşturur. const_cast
, dynamic_cast
, veya reinterpret_cast
, hiçbir zaman yeni bir sınıf türü nesne oluşturmayacaktır ve bu nedenle hiçbir zaman bir kurucu çağırmayacaktır. C tarzı döküm yana
static_cast
yeni bir nesne oluşturduğu aynı koşullarda yeni bir nesne oluşturur
static_cast
,
const_cast
ve
reinterpret_cast
bazı kombinasyonunu gerçekleştirir.
Bu doğru, ancak * yeni bir örnek oluşturduğunda (* IIC işlev stili kadronun her zaman yaptığı ve statik kalemin cv-kalifikasyonundan daha fazla olduğu zaman) olduğunu söylemek önemlidir. –
Yeni bir sınıf türü nesnenin oluşturulduğu tek zaman, hedef tür bir sınıf türü olduğunda "static_cast" ile olur. Cevabı bu ayrıntıyla güncelledim. –
Ancak bu –
- 1. Hata ne zaman projeye Yeni WebForm
- 2. Ne zaman * dahili * üzerinde yeni çalışma * kullanılmıyor?
- 3. ASP.NET kod arkasındaki dosyada sayfa sınıfı yapıcısını geçersiz kıl - ne zaman çağrılır?
- 4. Retrofit 2 Sıralı Yayınlar
- 5. Yeni pencerelerin ne zaman açıldığını ve/veya açık pencerelerin bir listesini ne zaman alabilirim?
- 6. Ne zaman getPermanentIDsForObjects :?
- 7. PAKET amaçlarına yönelik yayınlar alınamıyor
- 8. Dize s = yeni Dize ("Hello World") ne zaman kullanmalıyım?
- 9. Javascript'te yeni (anonim) bir işlev bildirmek ne zaman?
- 10. NSAutoreleaseHavuz. Yeni bir otomatikleştirme havuzu oluşturmak ne zaman uygun olur?
- 11. C++ açık şablon yapıcısını çağırır
- 12. Özel durumlar ne zaman sarılır
- 13. pthread_attr_destroy'u aramak ne zaman güvenlidir?
- 14. ApiController örneği ne zaman oluşturulur?
- 15. Android ViewPager, kapsayıcıda ne zaman değiştirileceğini açıklamıyor
- 16. TürScript'te genel türün algılanması
- 17. OpenGLES 2 - glBindTexture ne zaman ve ne zaman glActiveTexture?
- 18. Ne zaman assert() kullanılmalı ve ne zaman kullanılmalı?
- 19. Gen_Fsm ne zaman kullanılır ve Gen_Server ne zaman kullanılır?
- 20. GörünümWillAppear ve ne zaman viewDidLoad içine koymak ne zaman?
- 21. Ne zaman kullanılmalı ve Aurelia'da ne zaman kullanılır?
- 22. Vektörler ne zaman kullanılır ve C++ dizini ne zaman kullanılır?
- 23. undef_method ne zaman kullanılır ve remove_method ne zaman kullanılır?
- 24. Eklentiler ne zaman seçilecek ve ne zaman ipucu seçileceği
- 25. Bir kullanıcı ne zaman ve ne zaman bir Facebook paylaştı
- 26. RequireJS ne zaman arama asenkron gerektirir? Ne zaman senkronize edilir?
- 27. Android'de imleci kapatmak ne zaman?
- 28. HttpContext.User.Identity ne zaman ayarlandı?
- 29. Parallel.For ne zaman kullanılır?
- 30. [MTAThread] ne zaman kullanılmalıdır?
"A" static_cast "her zaman yeni, geçici bir nesneye neden oluyor" doğru değil. Örnek olarak, sınıf hiyerarşisi struct B {}; struct D: B {}; ', aşağıdaki 'static_cast' yeni bir nesne yaratmaz:' D d; B & b (static_cast (d)); '. Hedef türün bir nesne türü olduğu herhangi bir" statik_cast ", yeni bir nesne oluşturacaktır. –
@James Evet, daha hassas olmalıydım. Sınıf türlerini düşünüyordum (ilgili sorudan beri) kurucular) aslında kural basittir (ve tüm dökümler için aynıdır): eğer sonuçlar bir referans ise, yeni bir nesne yoktur, aksi halde vardır. (Standart açısından, bir tür dönüşümün sonucu ve eğer dönüşüm bir referans türüne ise, bir değerdir.) –