2012-05-25 17 views
7

Mi código:Constructor no establece variable miembro

#include <iostream> 
using namespace std; 

class Foo 
{ 
public: 
    int bar; 

    Foo() 
    { 
     bar = 1; 
     cout << "Foo() called" << endl; 
    } 

    Foo(int b) 
    { 
     bar = 0; 
     Foo(); 
     bar += b; 
     cout << "Foo(int) called" << endl; 
    } 
}; 

int main() 
{ 
    Foo foo(5); 
    cout << "foo.bar is " << foo.bar << endl; 
} 

La salida:

Foo() called 
Foo(int) called 
foo.bar is 5 

Por qué no es el valor foo.bar 6? Foo() se llama pero no establece bar en 1. ¿Por qué?

+4

'foo(); 'crea una objeto temporal sin nombre y lo destruye inmediatamente. ¿Qué es lo que esperabas que sucediera? – ildjarn

Respuesta

12

En el siguiente constructor, la línea con Foo() no delega en el constructor anterior. En su lugar, crea un nuevo objeto temporal de tipo Foo, no relacionado con *this.

Foo(int b) 
{ 
    bar = 0; 
    Foo(); // NOTE: new temporary instead of delegation 
    bar += b; 
    cout << "Foo(int) called" << endl; 
} 

delegación Constructor funciona de la siguiente manera:

Foo(int b) 
    : Foo() 
{ 
    bar += b; 
    cout << "Foo(int) called" << endl; 
} 

Sin embargo, esto sólo es posible con C++ 11.

+0

+1 para señalar "solo posible con C++ 11" -> http://meta.stackexchange.com/q/133642/186397. – Drise

2

Debido a que tiene esta línea en el constructor:

bar = 0; 

Usted está tratando de llamar a otro constructor con Foo() llamada en el segundo constructor, pero sólo crea un temp Foo ejemplo.

3

no puede usar el constructor como las funciones normales. en su código, llamar a Foo() crea un nuevo objeto en la pila.

Cuestiones relacionadas