数组
也许您在工程中根本不会这么做,但您也要知道。数组的列表初始化禁止缩窄转换
比如说:
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管理了一个内存池——堆。
函数结束的时候指针在栈中被回收,但是它所分配的堆空间却不会,极端情况会造成内存泄漏。