If your goal is to have quaternion that expresses rotations, and if you want to do operations with them (for eg. rotation composition by multiplying quaternions or convertion a quaternion to a rotation matrix), they must be unit quaternions, otherwise you may have unexpected results.
Quaternion normalization is a relatively costly operation involving squares and division and then should be avoided whenever possible to save CPU cycles.
Thanksfully, multiplication, for example as it is the most common quaternion operation, results in a unit quaternion when operands are unit quaternions themselves.
I would then recommend to let the user manually call normalization on a quaternion when he knows that the operation may have changed its length.
Hope it helps.