转自http://blog.sina.com.cn/s/blog_6ce6d0bf010145or.html
首先,要明确的是cstring, string, string.h 是三个文件名,而不是类名,如果你将vs 2010(或者其它版本)安装在默认路径下,这三个文件可以在C:/PRogram Files/Microsoft Visual Studio 10.0/VC/include路径下找到,查看每个文件里面的内容,结合网上看的一些帖子,我得出以下结论:
1、string.h是C标准库下的文件,C++向兼容C,所以包含了该文件,这个文件应该是原封不动的与C标准库下一致的。类似这样的文件还有math.h,setjmp.h,stdlib.h,stddef.h等等C标准库下的头文件;
2、cstring是C++对string.h的简略升级与包装,并将它放置在命名空间std下,该文件的所有代码如下:

所以,使用cstring时要用using namespace std,cstring里的内容与方法,应该与C标准库下的string.h一致。
3、而string就与前面两个有本质差别了。它是C++自己开发封装的类,它定义了一个string的字符串类,里面包含了string类的各种操作,如s.size(),s.erase(),s.insert()等。但<string>又包含了老的C版本的字符串操作如strcpy、strcat等,这就相当于,在<string>的文件中除了定义自己的string类之外,还加了一个#include<string.h>一句包含了C版本的字符串操作。
另外容易混淆的是,在MFC中,还有CString类,它与cstring是有本质区别的,前者是类名,使用时包含头文件afx.h,后者是文件名,两者实现的方法也大相径庭。