C++回炉之_C++PrimerPlus_第四章 复合类型(一)

数组

  • 数组的声明
    • int a[100];
    • typename array_name[array_size];
    • array_size 不能是变量
    • 可通过索引(下标)对数组元素进行访问 – 下标范围[0, array_size)
      • a[3] = 100;
  • 数组的初始化
    • int a[4] = { 3, 6, 8, 10};
    • 只有创建时才能初始化, 此后便不能使用初始化表初始化了
    • 也不能将一个数组赋值给另一个数组
    • 可只对一部分元素初始化, 剩下的默认为0
      • int a[4] = {2, 3}; // 此时数组值为 2 3 0 0
    • 若[]内为空,则编译器将自动计算元素个数
      • int a[] = {2, 3, 4, 5}; // 此时size = 4
    • 初始化时可省略等于号(=)(C++11新增)
      • double b[4]{1, 2, 3, 4};
    • 可不在{}内包含任何东西, 此时所有元素初始化为0
      • double b[4]{}

字符串

  • 以空字符(ASCII码为0, C++里表示为 ‘\0’)结尾的char数组
    • char pig[8] = { ‘v’, ‘e’, ‘r’, ‘y’, ‘f’, ‘a’, ‘t’, ‘\0’};
    • char pig[] = “veryfat”;
  • 任何两个由空白(空格, 制表符, 换行符) 分隔的字符串常量,都会自动拼接为一个
    • cout << “aaa” “bbb” endl;
  • 面向行的输入 – getline()
    • getline将丢弃换行符, 使用空字符替代
      • cin.getline(name, size);
  • 面向行的输入 – get()

    • 并不读取换行符,而是将其留存输入队列中
      • cin.get(name, size); // 此时换行符留在了输入队列中
      • cin.get()可读取下一个字符即使是换行符
    cin.get(a, maxn);
    cin.get();          // 读取换行符
    cin.get(b, maxn);

    也可以是

    cin.get(a, maxn).get();
    cin.get(b, maxn);           // 返回一个cin对象 getline()也是
  • getline()或get()读取空行时
    • get()读取空行后将设置失效位(failbit), 这意味着接下来的输入将被阻断
    • 可用 cin.clear(); 来恢复输入
    • 当输入字符串比分配的空间长时,余下的字符将会留在输入队列中,且getline()会设置失效位
    • 当使用cin>>a输入数字之后,会将换行符留在输入队列,此时应使用cin.get() 或 cin.get(ch)来读取并丢弃换行符
  • < cstring >

    strcpy(charr1, charr2); // 复制charr2到charr1
    strcat(charr1, charr2); // 拼接charr2到charr1

string类

  • 初始化 – 可用C串初始化

    string str = "hello";
    string str {"hello"}; 
  • 赋值

    cin >> str;
    str1 = str2; // 可以将一个string对象(或C字符串)赋值给另一个string对象
  • 拼接

    str3 = str1 + str2;
    str1 += str2;           // 将str2附加到str1的尾部
  • 读取一行

    getline(cin, str);      // istream没有关于string的类方法
  • 原始字符串(raw)

    • 使用”()”作为定界符, R作为前缀 – 不需要转义字符
    • 可自定义定界符, 只要保证 “和 ( 之间的字符与 ) 和 “之间的字符一样即可
    cout << R"(Jim "King" uses "\n" instead of endl)" << endl;
    cout << R"+*(Jim "King" uses "\n" instead of endl)+*" << endl; // 自定义定界符

    将输出

    Jim “King” uses “\n” instead of endl
    Jim “King” uses “\n” instead of endl

结构体(struct)

// 定义结构体
struct node {
    char name[20];
    float volume;
    double price;
};

// 初始化
node a = { "dua", 12.5, 30.3};      // 使用初始化参数表
node b {"dra", 10.0, 11.2};         // C++11初始化结构体

// 访问结构体成员
cout << x.name << endl;

// 赋值
node c = a;
  • 可以在定义结构体的同时创建结构体变量

    struct node {
        char name[20];
        float volume;
    }a, b, c;
  • 同时也可以初始化此变量

    struct node {
        char name[20];
        float volume;
    }a, b = {"dua", 12.5}, c;
  • 也可以创建无名结构体

    stuct {             // 以后无法再创建同类结构体
        int x, y;
    }position;          
  • 结构体数组

     node x[2] = {
            {"dua", 12.5, 30.3},
            {"dra", 13.5, 40.3}
        };
     cout << x[1].name << endl;
  • 结构体中的位字段

    • 主要用于与硬件设备上的数据对应
    • 字段类型应为整型或枚举, 后面跟冒号, 后面跟一个数字以指定位数
    • 可以使用没有名称的字段来提供间距
    struct node {
        unsigned int SN : 4;        // 4位
        unsigned int : 4;           // 4位
        bool flag : 1;              // 1位
        bool ok : 1;                // 1位
    };
    
    node x = {14, true, true};
    if(x.flag) cout << x.SN << endl;

共用体(union)

union node {
    int int_val;
    long long_val;
    double double_val;
};

//使用
node x;
x.int_val = 15;
cout << x.int_val << endl;
x.long_val = 20;
cout << x.long_val << endl;
  • 可以存储不同的数据类型,但同时只能存储其中的一种
  • 这些成员的内存地址是相同的,所以共用体的长度为其最大成员的长度
  • 主要用于节省空间
  • 常用于操作系统或硬件的数据结构
  • 匿名共用体

    struct widget {
        char brand[20];
        int type;               // 负责确定哪个共用体成员是活动的
        union {                 
            long id_num;        // 有的ID为数字
            char id_char[20];   // 有的ID为字符串
        };
    };
    widget x;
    if(x.type == 1) cin >> x.id_num;
    else cin >> x.id_char;
    

枚举(enum)

enum color {red, green, blue};
  • 用来创建符号常量, 默认从0开始,依次递增
  • 枚举量可自动提升为int型, 但int 型需要强制转换成枚举型,且值要适当
  • 枚举型没有定义加法
  • 可省略枚举名称创建符号常量
  • 显示设置枚举值
    • enum color {red = 1, green = 4, blue = 8};
    • 也可以只显示地定义其中一些枚举量的值,而没有被赋值的枚举量的值则为其前一个枚举量+1
  • 枚举的取值范围
    • 上限 – 找到枚举量的最大值,那么, 大于这个最大值的、最小的2的幂再减去1,即为取值范围的上限
    • 下限 – 找到枚举量的最小值
      • 如果它不小于0, 则取值范围的下限即为0
      • 如果它小于0, 则要找到比它小的, 最大的2的幂再加上1,即为下限
    • 例如,枚举量的最大值为101, 则比它大的最小的2的幂为128, 减1为127,即为上限
    • 例如,枚举量的最小值为-6,则比它小的,最大的2的幂为-8,加1为-7,即为下限
  • 作用域内枚举(C++11) 见第十章
    • 当前传统枚举的作用域 为整个文件
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值