vsDev Всё зависит от того, какие задачи должно решать приложение и каким стандартам соответствовать. По поводу пересекающихся задач, решаемых различными библиотеками - не стоит путать мягкое с тёплым. Например, WinAPI - это чисто виндовый системный интерфейс, написан на C (никак не С++), и решает всякие системные задачи чисто под виндой. Его имеет смысл использовать, когда твое приложение не планируется портировать под другие ОС, и если оно достаточно требовательно к производительности, так как стандартные С-шные функции типа того же fprintf, fopen, fwrite или STL-ных filestream-ов в конечном счете всё равно вызывают те же самые API-функции, просто ты этого не видишь, так как это происходит уже в глубинах стандартной библиотеки С, или STL, то есть они (эти библиотеки и их функции/интерфейсы) являются обвязкой вокруг системного API (Виндового (WinAPI), Юниксового, и т.д., в зависимости от того, на какой платформе всё это исполняется). Ну и ещё без API-функций никак не обойтись в системном программировании.
STL - это стандартная библиотека темплейтов для С++. Там где есть С++ - есть STL. так что если хочешь писать именно на С++ (а не на С) - то очень рекомендую. Но так как её основная идея - это обеспечение кроссплатформенности и соответствие строгим стандартам, то, естественно, она предлагает весьма ограниченную функциональность. Более широкая функциональность предлагается библиотекой boost, которая, однако, не является стандартной, но широко используется наряду с STL и при этом является кросс-платформенной.
Насчет printf и cout - printf это С-шная функция, cout - это STL (то есть С++). То же самое с malloc и new - для управления динамической памятью в С юзают malloc, в С++ строго рекомендуют юзать operator new, хотя придерживаться этого правила совершенно не обязательно.
MFC - это майкросовтовская обвязка (достаточно неповоротливая и кривая) для работы с API-функциями, связанными непосредственно с графическим (оконным) интерфейсом винды. Многие её не любят, но я уже привык к её кривизне, так что часто юзаю её если мне надо быстренько склепать какое-нибудь небольшое оконное приложение.
CLR - это вообще rapid application development (RAD) framework. Это такой изврат, который майкрософт придумал, чтобы облегчить жизнь и разгрузить мозг бедным индусам, которых они нанимают в последнее время для написания своего софта. Причем, этот изврат настолько извращенный (прошу прощения за тавтологию), что он даже не совместим со стандартным языком С++, в результате чего майкрософту пришлось ещё и сам С++ извратить.
Одним словом, если не хочешь завязываться на мелкомягких, и писать свои приложения так, что они в результате будут легко компилироваться под любой другой системой, отличной от MS Windows - юзай STL и Boost для консольных приложений.
При этом я, например, стараюсь избегать, где это возможно, использования С-шных функций типа printf, malloc, fopen и т.д., так как мешать стандарты и подходы - плохая привычка, хотя, это уже личные предпочтения каждого.
Ну и не надо забывать, что С++ - это объектно-ориентированный язык, т.е., классы рулят
А то часто встречается ситуация, когда код на С++ выглядит как обычный С-шный функционально-ориентированный код, и в результате не используются все вкусности и полезности объектно-ориентированного подхода в целом, и языка С++ в частности.