2011-03-02 15 views
5

Suponga que tiene una función como esta:C++ ¿Se llama aquí al constructor de copia?

Foo foo() { 
    Foo foo; 

    // more lines of code 

    return foo; // is the copy constructor called here? 
} 

Foo bar() { 
    // more lines of code 

    return Foo(); // is the copy constructor called here? 
} 

int main() { 
    Foo a = foo(); 
    Foo b = bar(); 
} 

Cuando alguna de las funciones devuelven, se llama el constructor de copia (supongo que habría uno)?

+2

¿Qué quiere decir con "supongo que habría uno"? Cada clase tiene un constructor de copia (aunque puede ser 'private', o en C++ 0x' delete'd). Si la clase no declara uno, obtiene un constructor de copia implícitamente declarado. – aschepler

+0

También vea http://stackoverflow.com/questions/665825/copy-constructor-vs-return-value-optimization – xtofl

+2

Es fácil probar algo como esto. Simplemente implemente un constructor de copia e imprima un mensaje en él. – gregg

Respuesta

10

Podría llamarse o no llamarse. El compilador tiene la opción de utilizar la optimización del valor de retorno en ambos casos (aunque la optimización es un poco más fácil en bar que en foo).

Incluso si RVO elimina las llamadas reales al constructor de copia, el constructor de copia aún debe estar definido y accesible.

+1

+1 por mencionarlo aún necesita ser definido. – xtofl

+0

También existe la opción NRVO, que en realidad podría ser más fácil en foo. :-) –

2

Es puede llamar. También puede optimizarse de distancia. Vea algunos other question en la misma dirección.

Cuestiones relacionadas