int addOne(int x) { return (x+1); }
The int type of x is a static precondition guaranteeing that addOne will only be called with values that are ints. The int return type is a static postcondition guaranteeing that addOne always returns a value that is an int.
Types - (static preconditions and postconditions in C++) can be checked by the compiler. Dynamic preconditions and postconditions depend on run-time values. They cannot be checked in advance. Thus, it's up to the implementer to check explicit that they are met. For example:
int Bag::grab() // precondition: bag is not empty // postcondition: an arbitrary int from bag // is returned and // bag has 1 less element { // assume the existence of a member function // bool Bag::isEmpty() // check that the precondition is met assert (!isEmpty()); . . .