Validating C++ Time class objects
I don't like the internal storage type of (Hour/Min/Seconds).

private :
    int hour;
    int minute;
    int second;


This makes it hard to do comparison move forward backwards etc. I personally just store the number of seconds since midnight.

 private:
    int secondsSinceMidnight;


The converse to this is that usage may make this inefficient. If your main usage is just printing rather than modifying it may be worth keeping it as Hours/Minutes/Seconds (but I would measure before jumping to that conclusion as it is unlikely the main slowness in printing).

I don't like the default time being midnight.

    Time(const int h = 0, const int m  = 0, const int s = 0);    //with default value


If I construct a time object with no explicit value I usually expect it to be the current time. So personally I may default minutes and seconds to zero but I would expect at least the hours to be set. I would then provide a default constructor that sets the object to the current time:

    Time();  // Current time.
    explicit Time(const int h, const int m  = 0, const int s = 0);


Don't like Getters/Setters (they break encapsulation). Also I don't really see the use of this setter over the constructor.

    Time  x(5, 6, 7);

    // Now at a latter point I want to reset `x`;
    x = Time(8, 9, 10);

    // Performs equivalent action to:
    x.setTime(8, 9, 10);


When you provide a print method it is usally a good idea to also pass as an argument the stream you want to print on. This can default to std::cout but at least provide it.

    void print(std::ostream&amp; str = std::cout) const;       // Print a description of object in " hh:mm:ss"


This also lets you define the standard output operator for the class very easily.

    std::ostream&amp; operator&lt;&lt;(std::ostream&amp; str, Time const&amp; data)
    {
        data.print(str);
        return str;
    }


Now you can print using the method. Or the more more normal C++ technique.

    Time  x(5,7,8);
    x.print();              // defaults to std::cout
    x.print(std::cout);     // Or explicitly specify a stream.
    std::cout &lt;&lt; x;         // Or just stream to the output.


Fine to have a named function (but pass parameter as const reference).

    bool equals(Time const&amp; other) const;     //compare two time object


But why not define the equality operator as well. It makes the code more natural to read.

    bool operator==(Time const&amp; lhs, Time const&amp; rhs)
    {
         return lhs.equals(rhs);
    }


You don't need to manually put a zero into each field.

       (hour &lt; 10) ? std::cout &lt;&lt; 0 &lt;&lt; hour : std::cout &lt;&lt; hour;


There is a standard manipulator that does that automatically.

   std::cout &lt;&lt; std::setw(2) &lt;&lt; std::setfill('0') &lt;&lt; h &lt;&lt; ":"
             &lt;&lt; std::setw(2) &lt;&lt; std::setfill('0') &lt;&lt; m &lt;&lt; ":"
             &lt;&lt; std::setw(2) &lt;&lt; std::setfill('0') &lt;&lt; s &lt;&lt; "\n";