2012-06-08 24 views
9

Estoy aprendiendo C++ y estaba leyendo el constructor de copia desde C++: The Complete Reference. Los libros dicen queCopiar constructor con más de un parámetro

Está permitido que un constructor de copia tenga parámetros adicionales siempre que tengan argumentos predeterminados definidos para ellos. Sin embargo, en todos los casos, el primer parámetro debe ser una referencia al objeto que realiza la inicialización.

¿Pero estoy confundido de que cómo vamos a pasar esos parámetros adicionales? Estoy seguro de que debería haber alguna forma que no se da en el libro y que no puedo descifrar. ¿Puede alguien ayudarme?

EDIT: También es posible pasar estos parámetros adicionales en los tres casos, es decir,

  • Cuando un objeto inicializa explícitamente otra, tal como en una declaración
  • Cuando una copia de un objeto está hecho para ser pasado a una función
  • Cuando se genera un objeto temporal (más comúnmente, como un valor de retorno)
+1

_Los libros de Herbert Schildt_ están [mirados] (http://www.seebs.net/c/c_tcn4e.html) por [community] (http://stackoverflow.com/questions/18385418/c-meaning- of-a-statement-combining-typedef-and-typename # comment26999919_18385418). Es debido a la cantidad de errores en cada página, malas prácticas que profesa. [La guía y la lista definitiva de C++ Book] (http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list?rq=1) debería ayudarlo a elegir una buena. – legends2k

Respuesta

13

Aquí está un ejemplo sencillo:

class A { 
    //... 
public: 
    A (const A&, bool deep = false) { 
     if (!deep) { /* make a shallow copy */ } 
     else { /* make a deep copy */ } 
    } 
}; 

void foo (A x) { /*...*/ } 
A bar() { /*...*/ return A(); } 
A a_var; 

En este ejemplo, el parámetro se predetermina a falso, es decir, el constructor de copia por defecto será de poca profundidad.

A b(a_var);  // b gets a shallow copy of a 
foo(b);   // foo() receives a shallow copy 

Sin embargo, sería posible efectuar una copia profunda al pasar verdadero en el segundo parámetro.

A b(a_var, true); // b gets a deep copy of a 
foo(A(b, true)); // foo receives a shallow copy of a deep copy 

Del mismo modo, para una función que devuelve un A, el ejemplar de reenvío sería poco profunda, ya que está utilizando el valor por defecto, pero el receptor puede hacer que sea profunda cuando lo recibe.

A b(bar());  // shallow 
A b(bar(), true); // deep 

Recuerde cuando se define un constructor de copia, es probable que significa que tendrá que definir un destructor y sobrecargar el operador de asignación (la regla de tres).

+0

y ¿qué ocurre con los otros 2 casos, es decir, pasar un objeto a una función por valor y devolver el objeto? ... he actualizado la pregunta para el mismo. –

+0

@RaviGupta: gracias por la entrada, edición realizada. – jxh

1

Piénselo de esta manera: solo existe la noción de constructor. Cuando el compilador decide que se debe hacer una copia, busca un constructor al que se pueda llamar pasando un solo objeto del tipo T. Debido a este caso de uso especial, llamamos convencionalmente al constructor elegido como constructor de "copia".

Cuestiones relacionadas