1、命名空间的using声明
每个名字都需要一个using声明,一个using声明一次只能作用于一个命名空间成员:
#include <iostream>
using std::cin;
using std::cout;
using std::endl;
int main()
{
cout << " " << endl;
}
有一种情况下,必须总是使用完全限定的标准库名字:在头文件中。,因为#include,相当于头文件中的文本将成为我们编写的文件的一部分。注意:在头文件中应该只定义确实必要的东西。
2、标准库string类型
#include <string>
using std::string;
看一个例子:
int main()
{
string s;
cin >> s;
cout << s << endl;
return 0;
}
cin >> s从标准输入读取string,并将读入的字符串存储在s中,string类型的输入操作符:(1)读取并忽略开头所有的空白字符(如空格、换行符、制表符);(2)读取字符直至再次遇到空白字符,读取终止。如:" Hello World!"仅会读到"Hello"。
输入输出的行为与内置类型基本类似,返回左操作数作为运算结果。如:
string s1, s2;
cin >> s1 >> s2;
cout << s1 << s2 << endl;
最终的输出是HelloWorld!
用getline读取整行文本:getline接收2个参数:一个输入流对象和一个string对象。getline函数从输入流的下一行读取,并保存读取的内容到string中,但不包括换行符。 和输入操作符不一样的是:getline并不忽略开头的换行符,只要getline遇到换行符,即便是输入的第一个字符,getline也将停止读入并返回,如果第一个字符是换行符,则string为空string。
getline函数将istream作为返回值,和输入操作符一样也把它作为判断条件:
while(getline(cin,s))
cout << line << endl;
由于getline函数返回时会丢弃换行符,换行符将不会存储在string对象中。
3、string对象的操作
字符串仍然以"/0"标志结束,s.size()不计算"/0"占据的那个空间。
s.size()函数返回的类型是:string::size_type类型(使用时必须加上作用域操作符),这是为了C++库可移植性定义的配套类型,定义与unsigned型(unsigned int或unsigned long)具有相同含义,但是注意:任何存储string的size操作结果的变量必须为string::size_type型,不要把size的返回值赋给一个int变量。
(1)string关系操作符
C++中字符串比较实际上是字符串内字符的比较,而且区分大小写,在大多数机器上大写字母要小于相应的小写字母。在比较字符串时,需要比较两个字符串的长度及字符,如果一个字符串比另一个字符串短,但是短的string对象与长的字符串对象的前面部分匹配,则短的string对象小于长的字符串对象;如果两个string对象的字符不同,则比较第一个不匹配的字符。
(2)string对象的赋值
string st1, st2 = "The expense of ";
st1 = st2;涉及的工作:先把st1占用的相关内存释放掉,然后再分配给st1足够存放st2副本的内存空间,最后把st2中的所有字符复制到新分配的st1内存空间内。
(3)字符串相加
字符串相加即为字符串连接。
在和字符串字面值相加连接时,+操作符的左右操作数必须至少有一个是string类型的。
string s1 = "hello";
string s2 = "world";
string s3 = "hello"+", "; //error错误
string s4 = s1 + ", "+ "world"; //ok,这是因为s1+", "后返回一个string对象
string s5 = "hello"+", " + s2; //error错误
(4)从string对象获取字符
string s = "Hello";
可以用s[0] == 'H',下标是string::size_type类型的,注意不要越界,也可以用unsigned型
(5)字符操作函数
(6)采用C标准库头文件的C++版本
C标准库头文件命名形式为name.h,而C++版本则命名为cname,少了后缀.h而在头文件名前加了c,c表示这个头文件源自C标准库。