#include<iostream>
using namespace std;
class A{
public:
static int cnt;
A()
{
++cnt;
cout<<"constructor:"<<cnt<<endl;
}
~A()
{
--cnt;
cout<<"destructor:"<<cnt<<endl;
}
};
int A::cnt = 0;
A f(A x){
return x;
}
int main(){
A a0;
A a1 = f(a0);
return 0;
}
Il programma di uscita volontà:Perché il mio distruttore sembra essere chiamato più spesso del costruttore?
constructor:1 destructor:0 destructor:-1 destructor:-2
Il costruttore e distruttore non compaiono in coppia?
Benvenuti in Stack Overflow! +1 e grazie per aver fornito un programma di esempio completo. Vedi http://SSCCE.ORG perché è importante. –
Il contructor di copia invocato da 'return x;' è apparentemente ottimizzato, ma mi chiedo se un ottimizzatore sufficientemente aggressivo possa rimuovere l'invocazione quando chiama 'f' (' x' viene passato per valore). In modo efficace, si chiama il distruttore predefinito una volta e quindi il costruttore copia una volta. –
@FrerichRaabe: quell'ottimizzazione non sarebbe conforme allo standard, il che consente l'elisione del costruttore di copie solo in determinate circostanze. In tutte le circostanze consentite, la fonte o la destinazione della copia elisa è temporanea. –