3.4字符串类型
3.4.1C风格字符串
C++提供两种方式的字符串:C风格的字符串和标准C++引入的string类类型。字符串存储在一个字符数组中,一般通过一个char*类型的指针来操纵它。标准C库为操纵C风格的字符串提供了一组函数。
注意在计算字符串长度时候,空字符也要考虑在其中。一般为了更好的操控字符串,较好的解决方案是定义两个指针,一个始终指向头,另一个每次向后加一。
3.4.2字符串类型
字符串基本操作:1.支持用字符序列或第二个字符长对象来初始化一个字符长对象。2.支持字符串之间的拷贝。3.支持读写访问单个字符。4.支持两个字符串的相等比较5.支持字符串的连接6.支持对字符串长度的查询。7.支持字符串是否判断为空。
注意string中begin()和end()操作返回指向string 开始和结束处的迭代器(iterator)。迭代器是指针的类抽象,由标准库提供。
3.5const限定修饰符
const可以把一个对象转换成一个常量。不能对本身的值进行改变。
但是例如const double * cptr;
cptr是一个指向double类型,cons对象的指针。此中微妙在于cptr本身不是常量。我们可以重新赋值cptr,使其指向不同的对象,但不能修改cptr指向的对象。同时const指针赋值会在编译时刻被标记为错误,指向const对象的const指针的定义就是将前面两种结合起来。
3.6引用类型
引用(reference)有时候又称为(alias),他可以用作对象的另一个名字。通过引用我们可以间接地操纵对象,使用方式类似于指针。但是不需要指针的语法。在实际的程序中,引用主要被用作函数的形式参数----通常将类对象传递给一个函数。但是现在我们用独立的对象并示范引用的用法。
引用类型有类型标志符和一个取地址符来定义,引用必须被初始化。
虽然引用也可以被用作一种指针,但是想对指针那样用一个对象的地址初始化引用,却是错误的。然而我们可以定义一个指针引用。
3.7布尔类型
布尔型对象可以被赋值以文字值true或false。虽然布尔类型的对象被看做是一种整形类型的对象,但是它不能被声明为signed、unsigned、short或long。
当表达式需要一个算数值时候,布尔对象和布尔文字都被隐式地提升成int:false 变成0,而true变成 1。正如文字false和true能自动转换成整数0和1一样,如果有必要,算数值和指针值也能隐式地转换成布尔类型的值。0或空指针被装换成false,所有其他的值都被转换成true。
3.8枚举类型
枚举(enumeration)提供了一种替代的方法,它不断定义了整数常量,而且还把它们组成一个集合。每个被命名的枚举定义一个唯一的类型,它可以被用作类型类型标识符。此外我们还可以声明枚举类型对象,我们不能做到的是打印枚举成员的实际枚举名。一种解决方案是定义一个由枚举成员的值索引的字符串数组。第二节不能做的事情是,我们不能使用枚举成员进行迭代。
枚举类型关键字enum,加上一个自选的枚举类型名来定义,类型名后面跟一个用花括号括起来的枚举成员列表,枚举成员之间用逗号分开。在缺省情况下,第一个枚举成员被赋值0,后面的每个枚举成员依次比前面的大1。我们也可以显式地把一个赋值给一个枚举成员。
我们可以定义枚举类型的对象,它可以参与表达式运算,也叫以被作为参数传递给函数。枚举类型的对象能够被初始化,但是只能被一个相同枚举类型的对象或枚举成员集中的某个值初始化或赋值。但是在必要时候,枚举类型会自动被提升成算术类型。
3.9数组类型
被显式初始化的数组不需要指定维数值。编译器会根据列出来的元素个数来确定数组的维数: eg. int a[] ={1,2,3};
如果指定了维数,那么初始化列表提供的元素个数不能超过这个值。否则,将导致编译错误。如果指定的维数大于给出的元素的个数,那么没有被显式的元素将被置为0。
字符数组可以用一个由逗号分开的字符文字列表初始化,文字列表用花括号括起来,或者用一个字符串文字初始化。但是注意这两种形式不是等价的,字符串常量包含一个额外的终止空字符。
一个数组不能被另一个数组初始化,也不能被赋值给另一个数组。
用户必须清楚,c++没有提供编译时刻或运行时刻对数组下标的范围检查。除了程序员自己注意细节,并彻底地测试自己的程序之前,没有别的方法可以防止数组越界,能够通过编译并执行的程序仍然存在致命的错误,是不是不可能的。