void some_func(int param = get_default_param_value());
Respuesta
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.
}
¡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.
- 1. ¿Pueden los parámetros ser constantes?
- 2. ¿Los parámetros de la plantilla deben ser tipos?
- 3. Los indicadores de do C# deben ser secuenciales
- 4. ¿Los contextos de datos deben ser estáticos?
- 5. ¿Todos los métodos en la clase principal deben ser estáticos?
- 6. ¿Los destructores deben ser seguros para la fabricación de hilos?
- 7. ¿Los nombres de los objetos de Qt deben ser únicos?
- 8. Clasificación LINQ: los tres primeros deben ser fabricantes diferentes
- 9. ¿Los comandos de Do deben ser asincrónicos en CQRS?
- 10. Problema de un conmutador Java: las expresiones de caso deben ser expresiones constantes
- 11. Pase los parámetros en la función setInterval
- 12. ¿Pueden los parámetros [] ser parámetros para una expresión lambda?
- 13. Mezcla y parámetros nombrados en C#: ¿Por qué los parámetros de salida también necesitan ser nombrados?
- 14. Atributos de C#: Usar constantes enum como parámetros de entrada
- 15. C: función de señal (parámetros?)
- 16. Los controles de contenido deben ser controles de nivel superior
- 17. ¿Por qué los métodos parciales deben ser anulados?
- 18. Los inicios de sesión deben ser una página https
- 19. muestra los parámetros de función en vim
- 20. Buscar los parámetros de la función Dll
- 21. C# Enumeración Parámetros de la función
- 22. Función de envoltura en PowerShell: Pase los parámetros restantes
- 23. Usando C/Pthreads: ¿las variables compartidas deben ser volátiles?
- 24. ¿Por qué los parámetros opcionales en C# 4.0 requieren constantes de tiempo de compilación?
- 25. "Tipos de parámetros var reales y formales deben ser idénticos" en el Procedimiento
- 26. C# "Objetos constantes" para usar como parámetros predeterminados
- 27. ¿Por qué las sobrecargas del operador C# deben ser estáticas?
- 28. C#: ¿pueden 'salir' los parámetros en funciones ser propiedades/variables de objeto?
- 29. ¿Los objetos NSString deben ser alloc e init?
- 30. java @SafeVarargs por qué los métodos privados deben ser finales
Muchas gracias por la buena aclaración de los problemas. –
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. –
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