[原创]讨论string.h和string和std
又再试了一下,上网搜索了一下,没找到关于string.h和string的区别的介绍。
于是惟有自己探讨,先看如下代码,关键在于定义包含文件处。
#include<string> //没有加.h,加了的话就有错误发生
#include<iostream> //没有加.h,加了的话就有错误发生
using namespace std; //如果不加此句,将提示6个错误和1个警告
void main()
{
string str = "I love Queenie Wen!";
cout<<str<<endl; //包含文件处加了.h的话,发生的错误提示都在这行
}
错误提示如下:
binary '<<' : no operator defined which takes a right-hand operand of type 'class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >' (or there is no acceptable conversion)
以上提示大意是说,“<<”符号没有被定义给string类型,到不了string模板的指针allocator。
*小知识:“<<”和“>>”其实就是利用C++的运算符重载功能把输入输出定义为面向所有类型,printf和scanf中要标明输入输出类型,而cout和cin之所以不用,是因为被重载了所有值类型。
然后为什么要加上名字空间std呢?std是从旧类型C++过渡到.NET的产物,在Java中被广泛应用,而对于在过渡之前的旧C++用户会觉得很不惯,而对于新用户习惯了不加.h,而其实是编译提供方便,实际上是要加.h的,毕竟头文件的扩展名就是.h。不加.h的新规范则要附加上一句:
using namespace std; //注意是语句,所以要有“;”号作结束
在C++中新定义的string属于模板类的一种,在string标准库中定义,而string的内部定义就鲜为人们讨论,大家只顾着用,却没研究内部定义,其实string的定义被用名字空间std所包含了,就是说,string类型的使用及其跟随的函数都被定义在namespace std中,至于为什么叫std,或可不可以叫namespace live41,就无从考究,反正想main函数的args[][],是国际默许规则,也可以叫main(char live41[][])之类的作为运行参数变量名字,但既然大家都默许了那个args名字,就用吧。
用#include<iostream.h>和#include<string.h>是旧用户的写法,不过这样就不能使用C++新规定的string类型,而#include<iostream>和#include<string>就可以使用,并且要加上using namespace std;一句标明使用std库中的string定义,漏了说的就是,该std被包含在string中,所以又要加#include<string>,又要加using namespace std一句。
最后要讨论iostream.h和iostream的区别,当使用了#include<string>和std句子时,如果继续用iostream.h就输入输出不了string类型的变量和函数,因为string是新类型,所以要有新的“<<”“>>”重载方案,包含iostream.h的话就缺少了对string类型的支持,就是说iostream.h和iostream的区别大概就在于提供string类型的输入输出符号重载,两者并不是同一个文件。
看完以上,大家还是蒙蒙的吧?我也是,不好意思水平有限,但是我会下去继续找书来探讨。
[此贴子已经被作者于2004-09-23 12:27:19编辑过]