第四章 复合类型

本文介绍了C++编程中的一些关键概念,如数组的列表初始化、字符串的使用、共用体的内存对齐、枚举的类型安全以及内存的分配方式。强调了禁止缩窄转换的重要性,同时也探讨了不同类型的内存管理,包括自动存储、静态存储和动态存储,并提到了内存泄漏的问题。此外,还涉及了枚举的范围限制以及C++11后的线程存储。
摘要由CSDN通过智能技术生成

数组

也许您在工程中根本不会这么做,但您也要知道。数组的列表初始化禁止缩窄转换

比如说:

long plifs[]={25,98,3.0}; //not allowed
char slifs[4] {'h','i',1122011,'/0'}; //not allowed

第一行中,3.0转换为long型是由浮点数转化为整型,是缩窄转换。第二行1122011转化为char类型,由于其数值远大于char所能表示的,所以同样是缩窄转换。

字符串

long str="s";

字符串常量处了表示了其字符换内容外,他还隐含了字符串的地址,所以上述代码表示将s字符串的地址赋值给str。

不过还好,C++将地址视为另一种类型,编译器不会允许这样做的。


cout<<"str1" "str2"<<endl;

c++不仅可以使用+号将两个字符拼接。事实上,任何由两个空白(空格,制表符,换行符)分隔的字符串将拼成一个。

共用体(Union)

共用体能够存储不同的数据类型,但同时只能存储一种类型——功能同名字一摸一样,共用。

union one4all{
  char array[9];
  int int_val;
  double double_val;
};

共用体内存也需要对齐,它满足以下规则

  • 内存大于所能表示的最大内存数据

  • 遵循对其原则

  • 所有数据的偏移地址都是0

    所以one4all占用内存16字节,大于占用9字节的array,同时能被char,int,double整除。

枚举(enum)

枚举量是整型,所以可以将整型变量通过强制类型转换赋值给枚举变量。但是赋值的时候要鉴定范围。

  • 上限:通过枚举量的最大值找到距离该值最近的2的幂,然后-1

  • 下限:如果下限>=0,则取0。如果小于零,则同上,不过最后要加上负号。比如-6的下限是-8+1=-7。

    如果两个枚举内的名称冲突了,可以使用class使枚举变成作用域内枚举。C++提高了作用域内枚举的类型安全,带有class的枚举不能隐式的类型转换,但是可以显式转换。

enum class egg{Small,Medium};
enum t_shirt{Small,Medium};

egg choice = egg::Small; 
t_shirt = Medium;
int king = choice; //not allowed
int ring = t_shirt; //allowed
int sing = (int)choice; //allowed

分配内存

C++有三种方式:自动存储,静态存储和动态存储。c++11后新增了一种,线程存储。

  • 自动存储:函数内部定义的变量存储在自动存储空间 ,实际变量存储在栈中。

    自动存储空间意味着变量在所属函数被调用时自动分配,函数结束时自动消亡。

  • 静态存储:全局变量和static变量存储在静态存储中。
  • 动态存储:new和delete管理了一个内存池——堆。

    函数结束的时候指针在栈中被回收,但是它所分配的堆空间却不会,极端情况会造成内存泄漏。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值