VLarin писал(а):
Простой пример - объект CWnd, мембер другого CWnd (например CView), создается с пустыми параметрами при создании последнего, а потом, при первом обращении к объекту из CView происходит его инициализация, так как в момент создания CView хендл окна и прочая хрень не известна и несуществует в природе.
Да, MFC так спроектирована. Вообще MFC очень часто приводят как неиссякаемый источник примеров плохого дизайна.
CWnd может быть в двух состояниях - привязанный к реальному окну или пустой. Во-первых, таких классов немного и их наличие не заставляет переделывать дизайн всех остальных, а во-вторых, никто не мешает завести в них и конструктор с параметром для использования в большинстве простых ситуаций.
VLarin писал(а):
Я просто не фанат исключений, ну не нравятся они мне:))
Если можно все руками проверить, и что нужно сделать, то зачем исключения:).
Я-то думал, что техника придумана для того, чтобы избавить человека от ручного труда 
 
Возьмем пример (из головы, но похожий на реальность):
Код:
try
{
  OracleConnection con("host=xxx;login=xxx;passwd=xxx");
  con.Open();
  OracleCommand cmd("select name, email, salary from employees", con);
  OracleDataReader reader(cmd.ExecuteReader());
  while(reader.Read())
  try
  {
    SendGreetings(reader.GetString(0), reader.GetString(1), reader.GetInt(2));
  }
  catch(GreetingsException& e)
  {
    LogException(e);
  }
  catch(ConversionException& e)
  {
    LogException(e);
  }
}
catch(Exception& e)
{
  LogException(e);
}
Как именно будет выглядеть проверка руками, если ошибки могут произойти:
1. Внутри Open - скажем, пароль не тот.
2. Внутри ExecuteReader - скажем, потерли таблицу.
3. Внутри Read - скажем, отвалилась сеть.
4. Внутри GetInt - скажем, тупой DBA забыл поставить NOT NULL на salary.
5. Внутри SendGreetings - скажем, лежит почтовый сервер.