代码改变世界

C++Primer阅读笔记-第3章-标准库类型string

2012-11-12 23:59  kennyMc  阅读(292)  评论(0)    收藏  举报

string和vector是标准库中比较重要的2个类型。

3.1 命名空间的using声明
std::cout,::是域操作符,含义是右边操作数的名字可以在左边操作数的作用域中找到。
类似于NET中的命名空间,cout是命名空间std中定义的。
使用using声明可以字节引用名字,std::而不需要再引用该名字的命名空间。

#include <iostream>
using std::cout;
using std::endl;

int main()
{
    cout<<"Kenny"<<endl;
    system("PAUSE");
    return 0;
}

下面代码也是编译通过,虽然没看到书上提到,但是这样貌似是直接引用了整个命名空间。

#include <iostream>
using namespace std;

int main()
{
    cout<<"Kenny"<<endl;
    system("PAUSE");
    return 0;
}

3.2 标准库string类型
string类型是支持长度可变的字符串,c++标准库负责管理和存储字符相关内存。
using std::string;

string类型的构造函数:

#include <iostream>
#include <string>
using std::cin;
using std::cout;
using std::endl;
using std::string;

int main()
{
    //默认构造函数,str1为空字符串
    string str1;
    cout<<"默认构造函数str1值为:"<<str1<<endl;
    cout<<"请输入str1:";
    cin>>str1;
    cout<<"str1的值为:"<<str1<<endl;
    cout<<"----------------------"<<endl;
    //将s2初始化为s1的副本
    string str2(str1);
    cout<<"str2值为:"<<str2<<endl;
    cout<<"请输入新的str1的值:";
    cin>>str1;
    cout<<"新的str1值为:"<<str1<<endl;
    //证明了str2的值是拷贝的str1的值,存储在不同的内存地址里面,而不是指针那样指向相同

的内存地址
    cout<<"现在的str2值为:"<<str2<<endl;
    //将str3初始化为指定的字符值
    string str3("Hello Kenny!");
    cout<<"str3值为:"<<str3<<endl;
    //将str4初始化为4个's'的副本
    string str4(4,'s');
    cout<<"str4值为:"<<str4<<endl;
    system("PAUSE");
    return 0;
}

string对象的读写
cin读取:cin>>str1;
读取忽略开头空白字符(空格,换行符,制表符)
读取字符直到再次遇到空白字符,读取终止
下面是循环读取输入,直到按下Ctrl+z
string str;
while(cin>>str)//按下Ctrl+z发送EOF表示输入结束,后面加个回车
{
cout<<str<<endl;
}

getline读取整行文本
getline函数接受2个参数,一个输入流对象,一个string对象。
getline函数不忽略开头的换行符,即使第一个遇到的就是换行符,那么读取终止,string对象为空字符

string str;
while(getline(cin,str))//按下Ctrl+z发送EOF表示输入结束,后面加个回车
{
cout<<str<<endl;
}

3.2.3 string对象的操作
1.string的size和empty操作
string str;
getline(cin,str);
//size()是指string对象中的字符个数
cout<<"str是否为空:"<<(str.size()==0?"true":"false")<<endl;
cout<<"str的字符个数为:"<<str.size()<<endl;
//empty()返回bool类型
cout<<"str.empty():"<<(str.empty()?"true":"false")<<endl;

2.string::size_type类型
size_type是标准库中定义的与机器无关的配套类型,size_type是unsigned类型,不应该把size返回值
赋给一个int类型,这样在不同的机器上可能导致溢出,比如16位机器的int类型。

3.string对象的比较-跳过

4.string对象的赋值
string str="kenny";
string str1=str;
这里就算修改了str的值,str1也不会变,这里把str的值赋给str1,会先把str1占用的内存释放掉,然
后分配给str1足够存放str副本的内存空间,最后把str中的所有字符复制到新分配的内存空间。

6.字符串面值连接
这里注意下将2个字符串面值相加是非法的。
string str;
str="a"+"b";//这里就是非法的

7.从string对象获取字符
这里string对象可以用下标来获取其中的字符,下标操作符的类型是string::size_type,虽然这里也可
以用int类型来获取,但是可能由于不平台出现溢出,同时保证下标不超出作用范围。
string对象的下标从0开始,str[str.size()-1]代表最后一个字符。
string str("kenny");
for(string::size_type si=0;si<str.size();si++)
{
cout<<str[si]<<endl;
}
下标操作也可以用来赋值,str[si]='a';

3.2.4 string对象中字符的处理
这些函数定义在cctype头文件中,具体不写了

本文版权归kennyMc和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。