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.
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.
Comments
over! Im always looking for blogs like this!
golden slot mobile