Kopie des http://cpptruths.blogspot.com/2005/07/changing-c-function-default-arguments.html
In C++ Standardargumente der globalen Umfang Funktionen können leicht geändert werden.
In der Regel verwenden wir einen konstanten Ausdruck als Standardargument. C++ unterstützt sowohl statische Variablen als auch einen konstanten Ausdruck für ein Standardargument. Wir können auch eine Funktionssignatur in einem neuen Bereich mit einem anderen Standardwert neu deklarieren.
Standardargumente werden als globale statische Variablen implementiert. Daher kann derselbe Effekt erreicht werden, wenn der statischen Variable ein anderer Wert zugewiesen wird. Der folgende Code zeigt dieses interessante Feature.
#include
#include
#include
static int para=200;
void g(int x=para); // default argument is a static variable.
void f(int x=7); // default argument implemented in terms of some static varible.
int main(void)
{
void f(int x=70); // redeclaring function ::f
f(); // prints f70
g(); // prints g200
para=500;
g(); // prints g500
{
void f(int x=700); // redeclaring function f
f(); // prints f700
::g(); // prints g500
}
::f(); // prints f7 !!!!
// Note that earlier f() call in the same scope gave us f70!!
// This shows that :: (scope resolution operator) forces compiler to
// use global declaration with global signature's default value.
{
void g(int x=100); // redeclaring function g
g(); // prints g100!!!
std::cout << "para = " << para << std::endl; // prints para = 500
// Note that though value of para is unchaged local scope
// changes value of default argument.
}
::g(); // prints g500
return 0;
}
void f(int x)
{
std::cout << "f" << x << std::endl;
}
void g(int x)
{
std::cout << "g" << x << std::endl;
}
Als Programmierrichtlinie, wenn Sie den Wert des Standardargument ändern müssen, entweder durch die Funktion Signatur oder Neuzuweisung von statischen Variablen redelcaring, Sie besser es kein Standardargument machen und behalte es für ein einfaches Argument.
Ich sympathisiere, aber das ist nicht, wofür Stackoverflow ist. – Beta
@Beta Obwohl diese Seite rangiert höher als die verknüpfte, also .. – OJFord