Il motivo più comune per definire esplicitamente un operatore di assegnazione è supportare "proprietà remota", in pratica una classe che include uno o più puntatori e che detiene le risorse a cui tali puntatori fanno riferimento. In tal caso, normalmente è necessario definire l'assegnazione, la copia (cioè il costruttore di copie) e la distruzione. Ci sono tre strategie principali per questi casi (ordinati per frequenza decrescente di utilizzo):
- copia completa
- riferimento contando
- trasferimento di proprietà
copia profonda significa allocare una nuova risorsa per l'obiettivo del compito/copia. Per esempio., una classe stringa ha un puntatore al contenuto della stringa; quando lo assegni, l'assegnazione alloca un nuovo buffer per contenere il nuovo contenuto nella destinazione e copia i dati dall'origine nel buffer di destinazione. Viene utilizzato nella maggior parte delle implementazioni correnti di un numero di classi standard come std::string
e std::vector
.
Il conteggio di riferimento utilizzato anche è abbastanza comune. Molte (più?) Implementazioni precedenti di std::string
utilizzavano il conteggio dei riferimenti. In questo caso, invece di allocare e copiare i dati per la stringa, è semplicemente stato incrementato un conteggio di riferimento per indicare il numero di oggetti stringa che fanno riferimento a un particolare buffer di dati. Hai assegnato un nuovo buffer solo quando/se il contenuto di una stringa è stato modificato in modo tale che doveva differire dagli altri (ad esempio, utilizzava la copia su scrittura). Con il multithreading, tuttavia, è necessario sincronizzare l'accesso al conteggio dei riferimenti, che spesso ha un grave impatto sulle prestazioni, quindi nel codice più recente questo è abbastanza inusuale (usato principalmente quando qualcosa memorizza quindi molti dati che vale la pena potenzialmente perdere un po ' del tempo di CPU per evitare tale copia).
Il trasferimento di proprietà è relativamente inusuale. È ciò che è fatto da std::auto_ptr
. Quando assegni o copi qualcosa, la fonte del compito/copia viene sostanzialmente distrutta - i dati vengono trasferiti da uno all'altro. Questo è (o può essere) utile, ma la semantica è sufficientemente diversa dall'assegnazione normale che è spesso controintuitiva. Allo stesso tempo, nelle giuste circostanze, può fornire grande efficienza e semplicità. C++ 0x renderà il trasferimento della proprietà considerevolmente più gestibile aggiungendo un tipo unique_ptr
che lo rende più esplicito e aggiungendo anche riferimenti rvalue, che rendono facile implementare il trasferimento della proprietà per una classe abbastanza ampia di situazioni in cui può migliorare le prestazioni senza che conduce alla semantica visibilmente controintuitiva.
Tornando alla domanda originale, tuttavia, se non si dispone della proprietà remota per iniziare - ad esempio, la classe non contiene alcun puntatore, è probabile che non si debba definire esplicitamente un operatore di assegnazione (o dtor o copy ctor). Un bug del compilatore che impediva agli operatori di assegnazione definiti implicitamente di funzionare avrebbe impedito il superamento di un numero enorme di test di regressione.
Anche se in qualche modo venisse rilasciato, la vostra difesa contro di esso sarebbe semplicemente non usarlo. Non c'è un vero spazio per la domanda che una tale versione possa essere sostituita nel giro di poche ore. Con un progetto esistente di dimensioni medio-grandi, non si desidera passare a un compilatore finché non viene utilizzato per un certo periodo di tempo.
Si noti che l'esempio di codice non richiama l'operatore di assegnazione copia. Invoca il costruttore di copie. '=' Qui non è un compito, è un'inizializzazione. Avresti bisogno di qualcosa sulla falsariga di "CalibDataSet dataSetB; dataSetB = datasetA; 'per richiamare l'operatore di assegnazione copia. –
Beh, dipende. Mostra la definizione di CalibDataSet. Gestisce le risorse? –
Regola empirica: se tutto nella classe può e deve essere copiato da 'a.thing = b.thing', allora l'operatore generato automaticamente probabilmente sta bene. –