//: C10:StaticMemberFunctions.cpp
// From Thinking in C++, 2nd Edition
// Available at http://www.BruceEckel.com
// (c) Bruce Eckel 2000
// Copyright notice in Copyright.txt

#include <iostream>

class X
{

int i;
static int j;
public:

X(int ii = 0) : i(ii)
{

/* Non-static member function can access */
/* static member function or data: */
j = i;

}

int val() const { return i; }

/*Una funzione dichiarata come "static", puņ modificare solo variabili di tipo "static". Inoltre un'eventuale modifica apportata ad un attributo "static" interessa tutti gli oggetti di quella classe.*/

static int incr()
{

/*! i++; // Error: static member function */
/* cannot access non-static member data */
return ++j;

}

static int f()
{

/*! val(); // Error: static member function */
/* cannot access non-static member function */

return incr(); /* OK -- calls static */

}

};

int X::j = 0;

int main()
{

X x, x2;
X* xp = &x;
cout << "x.f() : " << x.f() << endl;
cout << "xp->f() : " << xp->f() << endl;
cout << "X::f() : " << X::f() << endl;
/* Only works with static members */
cout << "x2.f() : " << x2.f() << endl;
cout << "x.f() : " << x.f() << endl;

} ///:~