Static data members have class-wide storage of data which is independent of any particular object.
A static function member is independent of any individual class object.
The following class use static member field to track object count.
#include <iostream> class Pool {//from w w w .j a va2s . c o m private: double length {1.0}; double width {1.0}; double height {1.0}; static int objectCount; // Count of objects in existence public: // Constructors Pool(double lv, double wv, double hv); Pool(double side) : Pool {side, side, side} // Constructor for a cube { std::cout << "Pool constructor 2 called." << std::endl; } Pool() // No-arg constructor { ++objectCount; std::cout << "No-arg Pool constructor called." << std::endl; } Pool(const Pool& pool) : // Copy constructor length {pool.length}, width {pool.width}, height {pool.height} { ++objectCount; std::cout << "Pool copy constructor called." << std::endl; } double volume() const; // Function to calculate the volume of a pool int getObjectCount() const { return objectCount; } }; int Pool::objectCount {}; // Initialize static member of Pool class to 0 // Constructor definition Pool::Pool(double lv, double wv, double hv) : length {lv}, width {wv}, height {hv} { ++objectCount; std::cout << "Pool constructor 1 called." << std::endl; } // Function to calculate the volume of a pool double Pool::volume() const { return length*width*height; } int main() { const Pool pool1 {2.0, 3.0, 4.0}; // An arbitrary pool Pool pool2 {5.0}; // A pool that is a cube std::cout << "pool1 volume = " << pool1.volume() << std::endl; std::cout << "pool2 volume = " << pool2.volume() << std::endl; Pool pool3 {pool2}; std::cout << "pool3 volume = " << pool3.volume() << std::endl; // Volume = 125 Pool pools[6] {pool1, pool2, pool3, Pool {2.0}}; std::cout << "There are now " << pool1.getObjectCount() << " objects." << std::endl; }