C++ Primer Plus chapter 4

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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值