How to change default arguments in c++ [closed]
I know there an answer in following page,but i can't open it in my country... so, someone kind enough to copy and paste it here. Thanks in advance
http://cpptruths.blogspot.com/2005/07/changing-c-function-default-arguments.html
Copy of http://cpptruths.blogspot.com/2005/07/changing-c-function-default-arguments.html
In C++, default arguments of global scope functions can be changed easily.
Typically we use a constant expression as a default argument. C++ supports static variables as well as a constant expression for a default argument. We can also redeclare a function signature in a new scope with a different default value.
Default arguments are implemented as global static variables. Therefore, same effect can be achieved if we assign a differnt value to the static varibale. Following code shows this interesting 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;
}
As a programming guideline, if you need to change the value of default argument, either by redelcaring the function signature or reassignment of static variable, you better not make it a default argument and keep it a simple argument.
The gist of it:
1) Set up a static
, non-const
variable.
2) Set the argument to default to that variable's value.
3) Change the variable's value.
精彩评论