2012-07-20 21 views
5

Clase X -> convertida a Y de dos maneras 1) constructores, y 2) por funciones de conversión.
Entendí que el constructor de argumento único se usa para la conversión.Conversión por constructores

En la especificación:

Un declarada implícitamente-constructor de copia no es un constructor explícito; puede ser llamado para la conversión de tipo implícito.

Pregunta:

tanto, eso significa no sólo constructor sin argumentos solo se utiliza para la conversión, sino también constructor de copia ?. Si es así, ¿qué escenario se usa? cualquier fragmento de código de muestra?

Tengan paciencia conmigo si la pregunta es muy buena.

+1

El constructor de copias ES un constructor de argumento único. Pero no cambia el tipo, así que no sé por qué alguien lo llamaría una "conversión". –

+1

Estoy bastante seguro de que mi esposa se enojará si "te descubro". :-) –

+0

jaja, Jerry, gracias por señalar. :) – Whoami

Respuesta

1

El constructor de copia implícitamente declarado no puede usar para las conversiones, ya que es copy-ctor, que ha declarado como T(const T&) o T(T&).

proyecto n3337 par 12.8 C++ estándar.

8 El constructor de copia declarado implícitamente-para una clase X tendrá el forma X :: X (const X &) si - cada clase base B directa o virtual de X tiene un constructor de copia cuyo primer parámetro es de tipo const B & o const volátil B &, y - para todos los miembros de datos no estáticos de X que son de una clase tipo M (o una matriz de los mismos), cada tipo de clase tiene una copia constructor cuya primera El parámetro es del tipo const M & o const volátil M & .119 De lo contrario, el implicitly-declare d constructor de copia tendrá la forma X :: X (X &)

Desde copy c-tor no es explícita puede utilizar dicho código

struct So 
{ 
}; 

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

Si copy-ctor es explícito se puede utilizar solamente initizaliation como So s((So()));

+0

Se puede llamar una conversión de T a T por el bien de la generalidad. –

+0

@SergeyK. "puede ser" es lo mismo que "es". ¿Es esto una conversión o no? – curiousguy

+0

@ curiousguy: compruebe .pdf en mi respuesta –

3

El constructor de copia no es un constructor explícito, por lo que se usará siempre que sea posible. El constructor de copias se "convertirá" solo del mismo tipo, por lo que no es una conversión en el sentido completo. Sin embargo, en aras de la generalidad, es útil llamarlo uno.

Lea este artículo: http://www.keithschwarz.com/cs106l/winter20072008/handouts/180_Conversion_Constructors.pdf si desea obtener más información sobre los constructores de conversiones.

+0

"_Copy constructor no es un constructor explícito, por lo que se usará siempre que sea posible._" Y un constructor explícito se usará donde sea imposible. – curiousguy

+0

@curiousguy: así que son bastante iguales, ¿verdad? –

1

Un constructor de copia implícito es aquel que el compilador escribe para usted. Siempre tiene la forma

T(const T&); 

Esto significa que cualquier objeto que tiene un operador de conversión a const T& se puede copiar de forma implícita, aunque esto no es lo que quería. La forma más común de activar esto es hacer una copia a una clase base de una clase derivada; esto se denomina corte de objetos porque la copia no tendrá el mismo tipo que el original y probablemente perderá algunas propiedades o comportamientos importantes.

+3

No siempre. 12.8 par cláusula 8 n3337 borrador. – ForEveR

+0

@ForEveR, gracias por señalar eso. No sabía que había excepciones. Todavía estoy teniendo dificultades para imaginar cuáles son los casos más prácticos de leer el estándar. –

+1

@Mark: Básicamente, si su clase contiene un 'auto_ptr' (¿por qué lo haría, ya que' unique_ptr' se agregó?), Entonces su "constructor de copia" generado implícitamente tendrá una semántica de movimiento. –

2

Básicamente significa que usted puede hacer:

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

Si el constructor de copia se marcó explícito de que fallaría para compilar. Puede probar agregando: explicit A(A const &) {} a la estructura y recompilar el programa.

+0

¿Es eso una conversión? – curiousguy

Cuestiones relacionadas