C++ primer plus 第4章 复合类型

来源:互联网 发布:三大生物信息数据库 编辑:程序博客网 时间:2024/05/07 10:37
1. 数组初始化
  •  int array[ 3 ] = {1, 2, 3}; 只有在定义数组时才能使用这种初始化方式 
  • 不能直接将一个数组赋给另一个数组
  • 初始化数组时提供的值可以少于数组的元素数目,其他元素被设置为0.
  • 将所有元素都初始化为0: long array[] = {0};
  • 如果初始化时数组个数为空,那么编译器将通过初始化的个数计算元素个数
2. 字符串
两种方式:C-风格字符串:以\0结尾;string类库
  • char array[] = "array"; 使用引号括起来的字符串隐式地包含结尾的空值字符;让编译器计算元素数目更为安全;在确定存储字符串所需的最短数组时,别忘了将结尾的空值字符计算在内。
  • 双引号和单引号
单引号表示字符常量 ,'a'是字符串编码的简写, char a = 'a',是正确的。
但是“a”表示的是两个字符a和\0组成的字符串,实际上“a”表示的是字符串所在的内存地址,因此char a = “a”是非法的
  • 面向行的输入
1) cin.getline(arrayName, length); 读取一行,遇到换行符或读取超过length-1时停止。
2) cin.get(arrayName,length);不丢弃换行符,将换行符留在输入队列中,因此连续调用两次get()时,第二次会因为看到的第一个字符就是换行符而停止。cin.get()可以读取下一个字符(包括换行符),因此可以用它来处理换行符。
    可以使用cin.get(arrayName,length).get();
3) get()读取空行后将设置失效位failbit,接下来的输入将被阻断,要使用cin.clear()命令来恢复输入
  • 混合输入字符串和数字带来的问题
cout <<"your name:\n";
int year;
cin>>year;
cout << "food:\n";
cin.get(food, arrSize).get();
cin读取year后,将换行符留在了输入队列的末尾,接下来cin.get的时候第一个接收到的就是换行符,将认为是一个空行。需要在接下来的读取之前丢弃换行符
(cin>>year).get( )或(cin>>year).get( ch );

3. 结构
  • 允许使用=将结构赋值给同类型的结构
4. 共用体
只能同时存储一种类型,长度为其最大成员的长度。

5. 枚举
  • 只定义了赋值运算符,没有算术运算
  • 枚举量是整型,可被提升为int,但是int不能自动转换为枚举类型
  • 可以只显式地定义其中一些枚举量的值,如enum a{first, second = 100, third}; first在默认情况下为0,后面没有被初始化的枚举量的值将比其前面的枚举量大1。third为101
  • 可以创建多个值相同的枚举量
  • 可以通过强制类型转换将不是枚举量的值赋值给枚举变量,只要它位于枚举定义的范围内。最大值计算:比如最大枚举值是100,那么大于100的最小的2的乘方是128,那么枚举的最大值为128-1 = 127。如果最小的枚举量为-6,那么小于-6的最大2的乘方是-8,那么枚举的最小值为-8+1=-7
6. 指针和自由存储空间
  • OOP强调的是在运行阶段进行决策,而不是编译阶段
  • C++创建指针时,计算机将分配用来存储地址的内存,但不会分配用来存储指针所指向的数据的内存,为数据提供空间是一个独立的步骤。一定要在对指针应用*之前,将指针初始化为一个确定的、适当的地址
  • 指针不是整型,不能简单地将整数赋给指针,应通过强制类型转换将数字转换为适当的地址类型
int * p;
p = (int *)0xB8000000;
  • 计算机由于内存耗尽等原因无法满足new的请求时,new将返回0.
  • delete释放的是指针指向的内存,不会删除指针本身,可以将指针重新指向另一个新分配的内存块
  • 只能用delete释放使用new分配的内存,对空指针使用delete是安全的
  • 指针变量加1后,增加的量等于它指向的类型的字节数。
  • 指针名和数组名的区别:指针的值可以修改,数组名是常量;对数组应用sizeof操作符得到的是数组的长度,对指针应用sizeof得到的是指针的长度
  • C++中,用引号括起来的字符串像数组名一样,也是第一个元素的地址
  • 使用strcpy或strncpy将字符串赋值给数组。使用strncpy时,如果在到达字符串结尾之前,目标内存已经用完,则它将不会添加空值字符,需要手动添加。
7. C++管理内存的方式
自动存储、静态存储和动态存储
  • 自动变量
函数内部定义的常规变量,在所属的函数调用时自动产生,该函数结束时消亡
  • 静态存储
在函数外面定义或者声明变量时使用static
  • 动态存储
new和delete管理了一个内存池,叫做自动存储空间,允许在一个函数中分配内存,在另一个函数中释放它





























原创粉丝点击