2012-01-30 23 views
5

En un constructor de copia ¿por qué los argumentos deben tener valores predeterminados asociados a ellos? ¿Qué sucede si no hay valores predeterminados asociados con ellos y se proporciona más de un argumento en el constructor?copiar los parámetros del constructor

Por ejemplo:

X(const X& copy_from_me, int = 10); 

tiene un valor por defecto para el int, pero esto:

X(const X& copy_from_me, int); 

no. ¿Qué pasa en este segundo caso?

http://en.wikipedia.org/wiki/Copy_constructor

+0

¿Qué quieres decir? – kennytm

+0

X (const X y copy_from_me, int = 10); ¿y si escribo X (const X y copy_from_me, int); – haris

+1

+1 para la pregunta interesante, debe poner un poco más de esfuerzo en la presentación la próxima vez :) –

Respuesta

9

Un constructor de copia siempre toma un parámetro, la referencia a un tipo al que pertenece, no tal vez otros parámetros pero necesidad tienen valores por defecto.

Se llama a un constructor de copia como una función de copia y el propósito del constructor de copia es crear un objeto de un tipo utilizando un objeto del mismo tipo como base para la creación del nuevo tipo.

especificar la norma es que el constructor de copia sea del tipo:

T(const &T obj); 

Básicamente, esto permite la creación de objetos temporales durante la llamada a las funciones por valor o devolver los objetos del tipo por valor.
Esta sintaxis facilita la creación de un nuevo objeto como:

T obj1(obj2);  <--------- Direct Initialization 
T obj1 = obj2;  <--------- Copy Initialization 

Si los argumentos adicionales que se pasan al constructor de copia no tendría el mandato de tener valores por defecto entonces la construcción de objetos utilizando la sintaxis anterior no sería posible .
ahí la condición estricta,
no tal vez otros parámetros a un constructor de copia, pero que necesidad tienen valores por defecto.

9

Cuando se invoca un constructor de copia, lo único que se garantiza que estará disponible es una referencia a una instancia de la misma clase. Si el constructor de copia toma argumentos más allá de esta referencia requerida, esos argumentos deben tener valores predeterminados.

Digamos que tenemos un constructor con la firma siguiente:

X(const X&, int); 

Esto no puede ser utilizado como un constructor de copia por el segundo argumento. Por ejemplo:

X x1; 
X x2(x1); 

¿Cómo el compilador utilice el constructor de arriba para x2? No puede.

Por otra parte, la siguiente puede usarse como un constructor de copia:

X(const X&, int = 0); 
+0

+1 por más de un forro! – ezdazuzena

1

Un constructor de copia tiene que ser exigible con sólo un objeto del tipo para ser copiado:

Thing t1;  // default constructor 
Thing t2(t1); // copy constructor 

Si hay argumentos adicionales sin valores predeterminados, entonces el constructor no se puede llamar así, por lo que no es un constructor de copia.

3

Un constructor de copia tiene un parámetro que hace referencia al tipo que se copia.

Se puede tener parámetros adicionales, si éstos tienen valores por defecto. Si no tienen valores predeterminados, simplemente no es un constructor de copia.

Cuestiones relacionadas