2008-12-02 9 views

Respuesta

47

El parámetro predeterminado puede ser un subconjunto del conjunto completo de expresiones. Debe estar vinculado en tiempo de compilación y en el lugar de declaración del parámetro predeterminado. Esto significa que puede ser una llamada de función o una llamada a un método estático, y puede tomar cualquier cantidad de argumentos siempre que sean constantes y/o variables globales o variables de clase estáticas, pero no atributos de miembro.

El hecho de que esté enlazado en tiempo de compilación y en el lugar donde se declara la función también significa que si utiliza una variable, esa variable se usará incluso si una variable diferente sombrea el original en el lugar de la llamada a la función.

// Code 1: Valid and invalid default parameters 
int global = 0; 
int free_function(int x); 

class Test 
{ 
public: 
    static int static_member_function(); 
    int member_function(); 

    // Valid default parameters 
    void valid1(int x = free_function(5)); 
    void valid2(int x = free_function(global)); 
    void valid3(int x = free_function(static_int)); 
    void valid4(int x = static_member_function()); 

    // Invalid default parameters 
    void invalid1(int x = free_function(member_attribute)); 
    void invalid2(int x = member_function()); 
private: 
    int member_attribute; 
    static int static_int; 
}; 

int Test::static_int = 0; 

// Code 2: Variable scope 
int x = 5; 
void f(int a); 
void g(int a = f(x)); // x is bound to the previously defined x 
void h() 
{ 
    int x = 10; // shadows ::x 
    g(); // g(5) is called: even if local x values 10, global x is 5. 
} 
+0

Muchas gracias por la buena aclaración de los problemas. –

+1

No me di cuenta de que podría referirse a variables globales. Buenos recursos en http://publib.boulder.ibm.com/infocenter/comphelp/v8v101/index.jsp?topic=/com.ibm.xlcpp8a.doc/language/ref/cplr237.htm y http: // msdn. microsoft.com/en-us/library/e1dbzf09(VS.80).aspx. –

+5

También puede ser una llamada a través de un puntero de función, es decir. if foo (int arg = (* fp)()); Aquí, fp se busca en el ámbito donde se declara foo, pero * fp se evalúa cada vez que se llama a foo(). – MSalters

11

¡No tienen que serlo! Un parámetro predeterminado puede ser cualquier expresión dentro de ciertas limitaciones. Se evalúa cada vez que se llama a la función.

Cuestiones relacionadas