第四章-复合类型

来源:互联网 发布:opencv java 编辑:程序博客网 时间:2024/05/16 01:51

**

数组

**
仅说书上本节介绍的内容,至于voctor各种用法,这里不提,仅是总结书上内容,查漏补缺用。
声明数组通用格式为:

typename arrayName[arraySize];

例如:

short months[12];

说一下,arraySize必须为整型常数或者整型常量,总之必须为常量,不能为变量。
常见的有的错误:

int  sz =10;short array[sz];

这会报错!有时将sz写在很远处,看不出来。

数组初始化只有在定义数组是才能使用初始化,以后就就不能使用了,也不能将数组赋值给另外一个数组。

int cards[4] = {1,2,3,4};  //可以,没毛病int hand[4];hand[4] = {1,2,3,4};  //错误!!!

{}初始化列表,如下两种都可以:

double balances[10] = {};//所有元素置为0double counts[20] {};//所有元素置为0

字符串。

C风格的字符串,以空字符结尾,空字符写为\0,ASIC码为0.

char bird[11] = "mr.cheeps";char fish[] = "bubble";

两种方式都可以,第一种最好是个数对应好,赋值少了的话,剩余的会全是\0,多了的话会截断。第二种比较靠谱。时刻记住C风格字符串末尾有个\0.
cin.getline()函数读取输入整行。

char name[20];cin.getline(name, 20);

第二个参数表示最多读取20个字符,另外读取遇到换行的话,换行符被从输入流中读出,然后自动将换行替换成\0,结束输入。
与之对应的是cin.get()函数:

cin.get(name, 20);cin.get();

它读到换行后,换行留在输入流中,自己添加字符串需要的\0。
所以连续输入时,需要加上cin.get();读取输入流中的一个字符,将换行读取走,以免影响后续的语句在输入流中读到上次剩下的无用的换行。简单的方法是将他们串起来:

cin.get(name, 20).get();

复杂的花式输入输出,后续介绍。

string类型字符串
包含string后,就可以使用string来定义字符串了。string类位于std中。

string a ;//空字符串string b = “hehe”//常规初始化赋值,并且不会限制长度

赋值,a=b是允许的。
合并用+号就可以了,a+=b;
取得长度 a.size();
最后说一下string头文件和cstring头文件,
string是C++新定义个头文件,包含新定义的string类,也就是说要用string类型,必须包含string,并且std::string 。
cstring由前面的c可以看出是C遗留过来的,里面是C风格数组字符串的一些操作,比如用于赋值的strcpy(),用于拼接的strcat(),用于返回数组字符串长度的strlen()等等,反正一堆C字符串的操作都在里面,看着就头大。
还是多用string是王道。

**

结构

**
就是个小类。

    struct student    {        string name;        int age;    };

构造并初始化。

    student james;//可以留空,自动默认成员都为0    student kobe {"kobe", 32};//也可以直接赋值

**

枚举

**
构造:

enum weekdays{monday, tuesday, wednesday, thursday, friday};

用法:

weekdays day = monday;

枚举其实就是为一些常量提供了符号。例如上面默认的,数字0,1,2,3,4分别用符号monday, tuesday, wednesday, thursday, friday来表示。
也可以单独设置枚举量的值:

enum weekdays{monday=10, tuesday=20, wednesday=30, thursday=40, friday=50};

也可以只指定一部分:

enum weekdays{monday=10, tuesday, wednesday=30, thursday=40, friday};

这里有个规则就是后面的比前面的加1.例如Tuesday就是11,Friday就是41。
也可以有相同值:

enum weekdays{monday, tuesday=0, wednesday, thursday=1, friday};

这里Monday就和Tuesday一样为0,wednesday就和Thursday一样为1。不知道这种玩法有啥用。。。。。。

**

指针

**
直说一点:

int a = 5;int* ptr = &a;

虽然*靠哪边都无所谓,但是这种形式比叫好看。
ptr表示地址,*ptr表示解引用的变量
&a表示地址,a表示变量
so。。。ptr与&a完全等价、*ptr与a完全等价。
在指针解引用之前,一定要初始化为一个正确的地址!!!!

double fellow;cout<<*fellow<<endl;//这个错误还能挽回,它只是读取了一个不知道位置的数据,因为fellow可能指向任意随机一个位置*fellow = 35.0;//这个就比较致命了,因为将35写进了一个你不知道的地方,那个地方都有可能,所以会导致莫名其妙错误。

new 、delete

int* ptr = new int;...delete ptr;

delete只能释放由new分配的内存,本身指向变量地址的那种指针,不能delete:

int a = 5;int* ptr = &a;delete ptr;//错误!!!

也就是说delete要跟new成对出现。

new数组:

int* psome = new int[10];...delete [] psome; 

三注意:
1、new 与 delete、new[]与delete[]成对出现!
2、不delete同一块内存两次!
3、delete 空指针是可以的!
将常量字符串赋值给指针时,一定要是const指针:

const char* ptr = "china";//必须要const才可以,不然报错

这点要注意。
C形式字符串数组在初始化时,可以用=,其余必须用strcpy()等操作函数。

char arr1[] = "china";//OK,没问题char arr2[];arr2 = "china";//极端错误!strcpy(arr2, "china");//这样才可以。

明白能用string就用string了吧!

原创粉丝点击