2012-12-04 11 views
8

Eventuali duplicati:
What’s the motivation behind having copy and direct initialization behave differently?Perché l'inizializzazione della copia è così com'è? Perché richiedere il costruttore di copie?

E per l'inizializzazione copia, voglio dire in questo modo:

struct MyStruct 
{ 
    MyStruct(int) {} 
    MyStruct(const MyStruct&) {} 
}; 

MyStruct s = 5; // needs *both* the int and copy constructor 

Nonostante la programmazione in C++ per anni, non ho mai capito il codice qui sopra richiesto il costruttore di copie (grazie a jogojapan). Il temporaneo era sempre stato eliso, e come tale non lo sapevo nemmeno nemmeno esisteva (almeno a livello superficiale, nonostante fosse ottimizzato) finché non mi venne indicato.

Dopo una discreta quantità di googling, ho avuto l'idea di come funziona. La mia domanda è perché è così com'è?

Perché lo standard non lo ha fatto in modo che l'esempio precedente non abbia bisogno del costruttore di copie? C'è qualche caso/esempio specifico che dimostra che è necessario il costruttore di copie in questo tipo di inizializzazione?

Senza una spiegazione decente di perché le cose sono come sono, vedo solo questo come un artefatto fastidioso, ma preferisco non essere ignorante se c'è qualcosa di importante che mi manca.

+0

sembra che necessitano di costruttore di copia è per omonimo; in realtà è [non chiamato] (http://ideone.com/35fjAD). – iammilind

+0

@iammilind: Non è necessario chiamare è dovuto a ** Copia elision **, ma il costruttore di copie deve essere accessibile. Fondamentalmente, significa che lo standard * consente * di chiamare il costruttore di copie e che ** deve ** essere disponibile. L'Ottimizzazione non è standard garantita, anzi, è il contrario che lo standard soddisfa. –

+1

@JesseGood: Grazie per quello. Sembra che questo sia praticamente un duplicato. Un po 'deprimente non c'è una buona risposta su quell'altra domanda ... – Cornstalks

risposta

0

L'inizializzazione della copia di un oggetto è ambigua per l'inizializzazione diretta, entrambi possono essere utilizzati allo stesso modo per impostare valori uguali tra loro.

int a = 4; 
int a = int(4); 
int a(4); 

tutte queste chiamate sono ambigue, tutti impostare un pari a 4. La ragione di un costruttore di copia nel caso di un numero intero è convenienza, immaginate C++ tipi di dati senza questo

int a(foo(b,r)); //a little messy for a variable declaration 
int a = foo(b,r) //ok, cleaner 

si potrebbe anche potrebbe utilizzare un costruttore di copia implicito ed esplicito, ecco un esempio di programma che utilizza un costruttore di copia in modo esplicito per gestire i numeri immaginari:

#include <iostream> 
using std::cout; 
using std::endl; 
class complexNumbers { 
    double real, img; 
public: 
    complexNumbers() : real(0), img(0) { } 
    complexNumbers(const complexNumbers& c) { real = c.real; img = c.img; } 
    explicit complexNumbers(double r, double i = 0.0) { real = r; img = i; } 
    friend void display(complexNumbers cx); 
}; 
void display(complexNumbers cx){ 
    cout<<&quot;Real Part: &quot;<<cx.real<<&quot; Imag Part: &quot;<<cx.img<<endl; 
} 
int main() { 
    complexNumbers one(1); 
    display(one); 
    complexNumbers two =2; 
    display(200); 
    return 0; 
} 
Problemi correlati