Enter year, date, and month in any order, I'll organize it
Besides the obvious points already mentioned in the other answers

Don't populate member variables in a constructor from streamed input

Passing std::istream to populate members in the constructor looks weird:


date(istream &amp;is) { is &gt;&gt; year &gt;&gt; month &gt;&gt; day; }



The canonical way is to provide an input operator:

class date {
     friend std::istream&amp; operator&gt;&gt;(std::istream&amp; is, date&amp; d) {
          is &gt;&gt; d.year &gt;&gt; d.month &gt;&gt; d.day;
          return is; 
     }
     // ....
};


This allows to check the stream state for input errors after using it.

Don't promise things to users of your API, you cannot ever guarantee

As going for the logic you're trying to implement:

You are aware that it's not really possible to distinguish day, month and year inputs just by the bare numbers?

Some test cases in day, month, year order:


1 3 2
5 11 23
...


Well, month must be below or equal 12 and days below or equal 31, but what about days up to 12 or years input up to 12/31?

You actually have to require a specific date format for user input

Users won't be happy with wrong guesses from your code, and what you're promising isn't possible at all.

This is a major flaw in your code, and renders any other discussion merely useless.