c++中符合数据类型就是在基本数据类型的的基础上对各个数据组合,然后去重新定义一新的数据类型。例如:数组,结构体、公用体,枚举,指针。
a:数组:可以访问单独数组元素。
数组声明: typename arrayname[arraysize]
数组的声明包括三部分:
1.typename:存储存储在每个元素中的值的类型。
2.arrayname:数组名。
3.arraysize:数组中元素数。
数组的初始化:
1.int cards[4]={3,4,5,6,7};直接用花括号括起来然后花括号里面的元素之间用逗号隔开。
2.int cards[4]={3,4,5};如果花括号里的元素个数小于数组中元素数则编译器其他元素都初始化为0.
3.int cards[ ]={3,4,5};如果没有说明数组的大小,则编译器会根据花括号中数据的多少来给cards数组加上对应的数组元素。
注:
1.数组的使用过程中是不能将一个数组赋值给另一个数组。即hand=cards,这个操作是不合法的。
2.字符数组的命名过程中花括号里的每一个值必须用分好括起来。char cards={'c','a','r','d'};
3.初始化的时候禁止缩窄变换。即:不可以把double值赋值给int 这是不被允许。
4.在初始化数组时,等于号是可以省略的。int cards[4]{1,2,3,4}。
b:字符串
char haha[6]={'h','a','h','a','\0'};
字符串是以空字符结尾的,空字符被写作为''\0'',其ASCII码的值为0.用来标记字符串的结尾。
c++中cout等字符处理函数都是逐个处理字符串中的字符,直到达到空字符为止。
1、字符串的初始化
char haha[11]={"hahahahaha"};
char xixi[12]={"XIXIXIXXI"};
用引号括起来的字符串隐式地包括结尾的字符串,因此不用显示地包括它。
在c++中的各种工具通过键盘将字符串输入到char数组中来,将自动加上结尾的空字符
2、在数组中对字符串的使用
从标准头文件cstring提供了很多与字符串相关的其他函数声明例如:
strlen(haha):计算字符的长度但是这个只可以计算可见的字符的长度,而不把空字符计算在内,因此数组的字符长度不能短余strlen(haha)+1。
strcpy(haha,xixi):将xixi复制到haha中去。
strcat(haha,xixi):将xixi的值添加到哈哈后面。
strcmp(s1,s2):字符串比较函数s1 若大于s2 则返回大于0 的值。s1 若小于s2 则返回小于0 的值。如果s1与s2的第一个字符相等则返回0值,然后按照下一位开始比较直到返回的值不等于0。字符串的比较就是逐个按照字符进行比较。字符的大小顺序是以ASCII 码表上的顺序来决定,此顺序亦为字符的值。
3、字符串的输入
cin:使用空白、空格符、换行符和制表符来确定字符串结束的为止,这就意味着cin在获取字符数组输入时制度取一个单词,读取该单词后,cin将字符串放到数组中,并自动在结尾添加空字符。
cin.get():每次读取一行输入直到达到换行符,cin.get()在读取完这一行数组时,将换行符保留在输入序列中。因此经常使用cin.get()来读取多余的、存入内存的、影响下一次输入换行符。cin.get(haha,11);cin.get();
cin.getline():与cin.get()的作用是相同的,但是cin.getline()将会直接丢弃换行符不把它放入到内存当中用空字符来替代换行符把它存入到数组当中。通常这样使用cin.getline(haha,4);
注:
1.当输入的字符串大于数组的存储长度时,getline和get会把剩下字符剩下到内存当中,而getline()还会设置失效位。
2.当get()读取空行位时候将设置失效位,这就意味这接下来输入的阻断,但可以用下免的命令来恢复输入:
cin.clear();
3.混合输入字符串和数字的时候,应注意内存中换行符号的清除,而避免多余的输入。通常按照如下的方法使用:
cin>>year;
cin.get();
...
cin.getline();
c:string类的应用
string类位于名称空间std当中,string类定义隐藏了字符串的数组性质,让您能够处理普通变量那样处理字符串。
类程序设计能够自动处理string类的大小。例如,str1的声明创建一个长度为0的string对象,但程序将输入读取到str1时,将自动调整str1的长度。
1.str1的初始化以及建立
string haha={"hahah"};
string xixi={"xixi"};
2.字符串的处理
赋值:可以将一个string对象直接赋值给另一个string对象。即:haha=xixi;
拼接:可以将一个string对象直接简爱到另一个string对象的后面。
haha=haha+xixi;
附加:可以将一个字符串直接附加到一个string 类对象的后面。
haha=haha+“xixi”;
获得类对象的长度:由于string类中定义直接获取字符串长度的方法size(),因此可以直接通过类对象直接调用这个方法,此方法在计算字符串长度时,也时计算的和strlen相同在长度的计算中都不包括空字符。
int length=haha.size();
3.string类对象的输入与输出
cin和运算符<<来将输入存储到string对象中,cout和运算符<<来显示string对象。每次读取一行而不是一个单词,使用的句法不同。
getline(cin,haha);也可以被用来使用对象haha的读入。
d:结构体
结构是用户定义的类型,而结构体声明定义了这种类型的数据属性。定义结构描述———它描述了能够存储在结构中的各种数据类型,然后按描述创建结构体对象。结构体就可以看作是只有共有数据没有私有数据和类接口的类(类的描述将会在后面介绍)。
1.结构体的声明
struct 结构名
{
int 数据名;
};
struct palyer
{
std:string name;
int ages;
};
2.结构体对象的创建、初始化以及数据的调用
player basket={ "haha",23};在创建的过程中等号是可以去掉的。
player basket;
basket.age=25;
basket.name="haha";//从上述的语句我们可以看出调用结构体中的数据要用到“.”。
3.结构体的其他用途
结构体数组也是可以被创造的,其用法节本变量数组的用法是相同的。
结构体数组的初始化如下:
player basket[2]={
{"haha",23},
{"xixi",24}
};
结构体也可以用做函数的返回值也是可以的。
可以创建结构体指针,将一个对象指向这个结构体。
注意:同一结构体的不同对象那个时可以相互赋值的。
basket[0] =basket[1]
e:共用体
公用体用途:存放一个基本数据但是这个数据的类型大于等于两个,则就需要应用到共用体。在共用体中定义的数据是不会同时被使用。共用体也需要声明和定义。其调用方法、声明方法和初始化方法与结构体是相同的。
当结构体当中声明匿名共用体,共用体的数据就可以看做是结构体中的数据,结构对象在调用时每次只能调用一个,其他情况与结构体调用的一般情况相同。
union price
{
int value;
double value;
float value;
};
price haha;
haha.value=25;
注:共用体在定义的过程中每一次都存储一个值,计算机分配的内存空间就是在公用体中定义的类型中占据最大字节类型的空间
f:枚举类型
枚举类型的标志是enum,可以应用这个标识符将数据名设置为枚举就像struct被称为结构一样。
enum spectrum {red,orange,yellow};
enum 将spectrum设置为枚举,可以利用枚举来设置枚举变量。red等常量被称为枚举量他们在未赋予确定的值时,采用默认值(0—2);
注意:
1、枚举量之间只定义了赋值符号不能进行其他符号的运算。
2、相应的枚举量只可以赋值给相应的枚举变量。
枚举量的取值范围:
计算上限:找到最大的枚举量。找到大于这个最大值的、最小的2的幂,将它减去1,得到的便是取值范围的上限。
计算下限:找出枚举量的最小值,如果它小于0,则取值的范围下限为0;否则,采用与寻找上限方式相同的方式。