2011-05-13 16 views
16

Ben Visual Studio aşağıdaki programı denedik 2010.C++ yıkıcı davranış

#include <iostream> 
using namespace std; 

class A { 
public: 
     int p; 

     /*A(){ 
      cout << "Constructor A" << endl; 
     }*/ 

     ~A(){ 
      cout << "Destructor in A" << endl; 
     } 
}; 

class D: public A 
{ 
public: 

     /*D(){ 
      cout << "Constructor D" << endl; 
     }*/ 

     ~D(){ 
      cout << "Destructor in D" << endl; 
     } 
}; 

int main() 
{ 
    D d = D(); 
    cout << "Exiting main" << endl; 
} 

aldığım çıkış oldu -

Destructor in D 
Destructor in A 
Exiting main 
Destructor in D 
Destructor in A 

ben anlamak mümkün değilim neden D sınıfı yıkıcı ve A "ana çıkılıyor" ifadesi çalıştırılmadan önce deniliyor?

başka işlerim çalıştı - Sonra çıktı ben beklendiği gibi, yukarıdaki kodda D sınıfı yapıcısı uncommented -

Constructor D 
Exiting main 
Destructor in D 
Destructor in A 

Burada ne eksik?

cevap

19

hat ilk

D d = D(); 

sonra d kopyalanır geçici, adsız bir nesne oluşturur. Gördüğünüz şey, ifade bittiğinde geçici nesnenin yok edilmesi. d adlı nesne main() tamamlandıktan sonra kapsam dışına çıktığında yok edilir.

Bir kopya oluşturucuyu D'a eklerseniz, çağrıldığını görürsünüz.

Yapıcıyı görüntülerken, derleyici bazı optimizasyonlar yapabildiğinden beklenen davranışı gördüğünü düşünüyorum.

+0

İkinci örneğin neden yıkıcı aramalarını yazdırdığını açıklamıyor. – Xeo

+0

Nasıl olması gerektiğini anlatabilirsiniz (: –

+0

Derleyici yalnızca gözlemlenemeyen en iyileştirmeler yapmasına izin verilir. Kopyalama elemen olsa bile, arama hala yazdırılmalı. – Xeo