#include
using namespace std;
class A{
public:
static int cnt;
A()
{
++cnt;
cout<<\"constructor:\"<
You need to add a copy constructor that increases the counter.
A(const A&)
{
++cnt;
cout<<"copy constructor:"<
If you don't add it explicitly, the compiler generates one that does nothing with the counter cnt.
This expression
A a1 = f(a0);
is creating copies of a0, which make use of the copy constructor. The exact number of copies may vary depending on copy elision, but your cnt should be 0 at the end of the program.
Note: In C++11, you should also consider the possibility of a compiler generated move copy constructor, however, once you declare your own copy constructor, the compiler no longer generates the move version.