Here is a little test program:
#include <iostream>
class Test
{
public:
static void DoCrash(){ std::cout<< "TEST IT!"<< std::endl; }
};
int main()
{
Test k;
k.DoCrash(); // calling a static method like a member method...
std::system("pause");
return 0;
}
On VS2008 + SP1 (vc9) it compiles fine: the console just display "TEST IT!".
As far as I know, static member methods shouldn't be called on instanced object.
- Am I wrong? Is this code correct from the standard point of view?
- If it's correct, why is that? I can't find why it would be allowed, or maybe it's to help using "static or not" method in templates?
It's potentially useful in several scenarios:
[the '"static or not" method in templates' you suggest:] when many types could have been specified to a template, and the template then wants to invoke the member: the types providing a static function can be called using the same notation as a member function - the former may be more efficient (no
this
pointer to pass/bind), while the latter allows polymorphic (virtual
) dispatch and use of member dataminimising code maintenance
if a function evolves from needing instance-specific data to not needing it - and is therefore made
static
to allow easy instance-free use and prevent accidental use of instance data - all the points of existing client usage don't need to be labouriously updatedif the type's changed the
var.f()
invocation continues to use thevar
type's function, whereasType::f()
may need manual correctionwhen you have an expression or function call returning a value and want to invoke the (potentially or always)
static
function, the.
notation may prevent you needing to usedecltype
or a supporting template to get access to the type, just so you can use the::
notationsometimes the variable name is just much shorter, more convenient, or named in a more self-documenting way
static methods can be called also using an object of the class, just like it can be done in Java. Nevertheless, you shouldn't do this. Use the scope operator like
Test::DoCrash();
Maybe you think of namespaces:which can only be called by
Test::DoCrash();
from outside that namespace if the function is not imported explicitly using ausing directive/declaration
into the scope of the caller.The standard states that it is not necessary to call the method through an instance, that does not mean that you cannot do it. There is even an example where it is used:
C++03, 9.4 static members
Static functions doesn´t need an instanciated object for being called, so
behaves exactly the same as
using the scope resolution operator (::) to determine the static function inside the class.
Notice that in both case the compiler doesn´t put the
this
pointer in the stack since the static function doesn't need it.