2012-07-20 10 views
5

Classe X -> convertito in Y da due modi 1) costruttori e 2) da funzioni di conversione.
Ho capito che il costruttore di argomento singolo è utilizzato per la conversione.Conversione per costruttori

Nella specifica:

Un costruttore di copia implicitamente dichiarata non è un costruttore esplicito; può essere chiamato per la conversione di tipo implicita.

Domanda:

Quindi, questo significa che non solo il costruttore unico argomento viene utilizzato per la conversione, ma anche costruttore di copia ?. In tal caso, quale scenario viene utilizzato ?. qualche snippet di codice di esempio?

Gentilmente sopportare me se la domanda è molto di base.

+1

Il copy-constructor È un costruttore a argomento singolo. Ma non cambia il tipo, quindi non so perché qualcuno lo chiamerebbe una "conversione". –

+1

Sono abbastanza sicuro che mia moglie si arrabbierà se io "nudo con" te. :-) –

+0

haha, Jerry, grazie per avermelo fatto notare. :) – Whoami

risposta

1

Il costruttore di copie implicitamente dichiarato non può utilizzare per le conversioni, poiché è copy-ctor, che ha dichiarato come T(const T&) o T(T&).

bozza n3337 par 12,8 standard C++.

8 Il costruttore di copia implicitamente dichiarata per una classe X avrà la modulo X :: X (const X &) se - ogni classe base diretta o virtuale B di X ha un costruttore di copia il cui primo parametro è di tipo const B & o const volatile B &, e - per tutti i membri di dati non statici di X che sono di un tipo di classe M (o matrice dello stesso), ciascun tipo di classe ha un costruttore il cui primo parametro è di tipo const M & o const volatile M & .119 Altrimenti, la dichiarazione implicita d costruttore di copia avrà la forma X :: X (X &)

Dal copy c-tor non è esplicito è possibile utilizzare tale codice

struct So 
{ 
}; 

int main() 
{ 
    So s = So(); 
} 

Se copy-ctor è esplicito si potrebbe utilizzare solo inizializzazione come So s((So()));

+0

Può chiamare una conversione da T a T per motivi di generalità. –

+0

@SergeyK. "può essere" è uguale a "è". È una conversione o no? – curiousguy

+0

@curiousguy: controlla il .pdf nella mia risposta –

3

Il costruttore di copia non è un costruttore esplicito, quindi verrà utilizzato laddove possibile. Il costruttore di copia "convertirà" solo dallo stesso tipo, quindi non è una conversione in senso pieno. Tuttavia, per motivi di generalità è utile chiamarlo uno.

Leggere questo documento: http://www.keithschwarz.com/cs106l/winter20072008/handouts/180_Conversion_Constructors.pdf se si desiderano ulteriori dettagli sui costruttori di conversione.

+0

"_Copy constructor non è un costruttore esplicito, quindi verrà utilizzato ovunque possibile ._" E un costruttore esplicito verrà utilizzato ovunque sia impossibile. – curiousguy

+0

@curiousguy: quindi sono uguali, non è vero? –

1

Un costruttore di copia implicito è uno che il compilatore scrive per te. Ha sempre la forma

T(const T&); 

Ciò significa che ogni oggetto che ha un operatore di conversione per const T& può essere implicitamente copiato, anche se questo non è quello che volevi. Il modo più comune per attivare questo è di fare una copia in una classe base da una classe derivata; questo è chiamato slicing degli oggetti perché la copia non avrà lo stesso tipo dell'originale e probabilmente perderà alcune proprietà o comportamenti importanti.

+3

Non sempre. 12.8 par clausola 8 n3337 draft. – ForEveR

+0

@ForEveR, grazie per averlo sottolineato - non sapevo che c'erano delle eccezioni. Sto ancora avendo difficoltà a immaginare quali sono i casi pratici da leggere nello standard. –

+1

@Mark: in sostanza, se la classe contiene un 'auto_ptr' (perché dovresti, dal momento che' unique_ptr' è stato aggiunto?), Il tuo "costruttore di copie" generato implicitamente avrà semantica di spostamento. –

2

Fondamentalmente significa che si può fare:

struct A {}; 
A a; 
A b = a; 

Se il costruttore di copia è stata segnata esplicita che verrebbe a mancare per la compilazione. Puoi testarlo aggiungendo: explicit A(A const &) {} alla struttura e ricompilando il programma.

+0

È una conversione? – curiousguy