4 复合类型
4.1 数组
- 数组的元素数目不能为变量,只能为常量,可使用new运算符避开这种限制
数组的初始化规则
- 只有定义数组的时候才能使用初始化
- 如果只对数组的一部分进行初始化,则编译器将其他元素设置为0
long table[50] = {0}; // 将数组所有元素置为0
long table[50] = {1}; // 将第一个元素置为1,其他元素置为0
C++11数组初始化方法
- 初始化数组时,可省略等号
long table[50] {0};
- 大括号内不包含任何数据,将把所有元素设置为0
long table[50] {};
- 初始化禁止缩窄转换
long table[50] {25, 92, 3.0}; // invalid,浮点转换为整型为缩窄操作
char table[50] {'h', 'i', 1112221, '\0'}; // invalid,1112221超出了char变量的取值范围
char table[50] {'h', 'i', 111, '\0'}; // valid
4.2 字符串
- 字符串常量和字符常量的区别
字符常量是字符串编码的简写,在ASCII系统上,'S’只是83的另外一种写法
但"S"不是字符常量,它表示的是两个字符(S和\0)组成的字符串
字符串输入
- getline()和get()区别
- 相同点:读取一行输入,直到到达换行符
- 不同点:getline()将丢弃换行符,get()将换行符保留在输入序列中
- getline()
cin.getline(name, 20); // 读取最长包含20个元素的字符串存储到name中
// 该函数返回一个cin对象,可仍调用getline函数
cin.getline(name, 20).getline(name1, 20); // 效果和两次单独getline相同
- get()
- 该函数将换行符保留在输入序列中,第二次get()读取到的为换行符
- 解决方法:
cin.get(name, 20).get()
- 读取空行和其他问题
- 下一条输入语句将在前一条getline()结束读取的位置开始读取
- get()(不是getline())读取空行后将设置失效位,接下来的输入将被阻断
- 解决方法为:
cin.clear()
、
4.3 结构
C++11 结构初始化
- 同数组一样,C++11也支持将列表初始化用于结构,并且等号可选,如果大括号内没有任何东西,各个成员将被设置为零,不允许缩窄转换
struct inflatable
{
char name[20];
float volumel
double price;
};
inflatable duck {"Daphne", 0.12, 9.98};
4.4 指针和自由存储空间
使用new和delete的注意事项:
- new和delete搭配使用,一个new对应一个delete
- 不能多次delete同一个指针
- 使用new []为数组分配内存,应使用delete []释放
- 使用new []为一个实体分配内存,应使用delete释放
- 对空指针应用delete是安全的
- 不能使用sizeof运算符来确定动态分配的数组吧包含的字节数
- 但是使用sizeof运算符计算数组名时,返回的是整个数组的长度
int32_t tacos[10] = {0}; // 注意tacos\&tacos\&tacos[0]的区别,三者值相同,但含义不同
4.5 指针\数组\指针算术
- 自动存储:在函数内部定义的常规变量使用自动存储空间,被称为自动变量,通常存储在栈中
- 静态存储:整个程序执行期间都存在的存储方式,一种是全局变量,一种是静态变量
- 动态存储:new和delete提供更灵活的方法,称为自由存储空间或堆
- 线性存储(C++11)