Elipse y argumentos predeterminados
Las funciones se pueden declarar para aceptar menos argumentos que los especificados en la definición de función, mediante uno de estos dos métodos: puntos suspensivos (...) o argumentos predeterminados.
Los puntos suspensivos denotan que los argumentos pueden ser necesarios pero no se especifican el número y los tipos en la declaración. Normalmente se considera una mala práctica de programación en C++, porque se frustra una de las ventajas de C++: la seguridad de tipos. A las funciones declaradas con puntos suspensivos se les aplican conversiones diferentes de las que se aplican a las funciones para las que se conocen los tipos de argumento formal y real:
Si el argumento real es del tipo float, se promueve al tipo double antes de la llamada a función.
Los campos con signo o sin signo char, short, de tipo enumerado o de bits se convierten a int con signo o sin signo mediante la promoción de enteros.
Cualquier argumento de tipo de clase se pasa por valor como estructura de datos; la copia se crea mediante copia binaria en lugar de invocar el constructor de copia de clase (si existe).
Los puntos suspensivos, si se utilizan, se deben declarar en último lugar en la lista de argumentos. Para obtener más información sobre cómo pasar un número variable de argumentos, vea la explicación de va_arg, va_start y va_list en la Referencia de la biblioteca en tiempo de ejecución.
Para obtener información sobre los argumentos predeterminados en la programación con CLR, vea ... (Listas de argumentos variables).
Los argumentos predeterminados permiten especificar el valor que un argumento debe asumir si no se proporciona ninguno en la llamada a función. El fragmento de código siguiente muestra cómo funcionan los argumentos predeterminados. Para obtener más información sobre las restricciones en la especificación de argumentos predeterminados, vea Argumentos predeterminados.
// expre_Ellipses_and_Default_Arguments.cpp
// compile with: /EHsc
#include <iostream>
// Declare the function print that prints a string,
// then a terminator.
void print( const char *string,
const char *terminator = "\n" );
int main()
{
print( "hello," );
print( "world!" );
print( "good morning", ", " );
print( "sunshine." );
}
using namespace std;
// Define print.
void print( const char *string, const char *terminator )
{
if( string != NULL )
cout << string;
if( terminator != NULL )
cout << terminator;
}
El programa anterior declara una función, print, que toma dos argumentos. Sin embargo, el segundo argumento, terminator, tiene un valor predeterminado, "\n". En main, las dos primeras llamadas a print permiten que el segundo argumento predeterminado proporcione una nueva línea para finalizar la cadena impresa. La tercera llamada especifica un valor explícito para el segundo argumento. El resultado del programa es
hello,
world!
good morning, sunshine.