04. 复合数据类型——string类

string类

  1. 可以使用string类来存储字符串

  2. 要使用string类,必须包含头文件string

  3. string类定义隐藏了字符串的数组性质

  4. 可以将一个string对象赋值给另一个string对象

  5. 可以使用加号合并string对象

  6. 可以使用strcpy()将字符串复制到字符数组中

  7. 使用函数strcat()将字符串附加到字符数组末尾

  8. 例子1

    # include <iostream>
    # include <string>
    int main()
    {
     
     using namespace std;
     
     char char1[20];
     char char2[20] = "abcde";
     
     string str1;
     string str2 = "qweryht";
        string str3;
     
     cout << "请输入字符串:\n";
     cin >> char1;  // 将键盘输入的内容存储到str1对象中 
     
     cout << "请再输入一个字符串:\n";
     cin >> str1;
        
        str3 = str1;
     
     cout << char1<< endl;
     cout << str1 << endl;
        cout << str3 << endl;
      
     
     return 0;
     } 
    
  9. string类I/O

    1. 例子

      # include <iostream>
      # include <string>
      # include <cstring>
      int main()
      {
        using namespace std;
        char char1[20];
        string str1;
        cout << "输入之前,char1的长度是:" << strlen(char1) << endl;
        cout << "输入之前,str1的长度是:"  << str1.size() << endl;
        
        cout << "输入char1:\n"; 
        cin.getline(char1,20);  // 将一行输入读取到数组中
        cout << "你输入的是:" << char1 << endl;
        
        cout << "输入str1:\n"; 
        getline(cin,str1); // 将一行输入读取到string对象中
        cout << "你输入的是:"<< str1<<endl;
        
        cout << "输入之后,char1的长度是:" << strlen(char1) << endl;
        cout << "输入之后,str1的长度是:"  << str1.size() << endl;
        
        return 0;
       } 
      
      • 输入之前,char1的长度为1(对于未被初始化的数据,第一个空字符出现的位置是随机的,所以这个值可能不同)
      • 输入之前,str1的长度为0,因为没有被初始化的string对象的长度自动设置为0
      • cin.getline(charr,length)是istream类的一个类方法
        • 参数charr:目标数组
        • 参数length:数组长度,可以避免数组越界
      • getline(cin,str):不是类方法
        • 参数cin:指出到哪里去查找输入
        • 参数str:目标string对象,这里不需要指出字符串长度,因为string对象将根据字符串的长度自动调整大小
  10. 其他形式的字符串字面值

    wchar_t title[] = L"Chief Jack";  // w_char类型,使用前缀L表示
    char16_t name[] = u"Three Z航"; // char_16类型,使用前缀u表示
    char32_t car[] = U"小汽车"; // char_32类型,使用前缀U表示
    

结构

  1. 结构(struct)一种灵活的数据格式,可以存储多种类型的数据,结构也是cpp类的基础

  2. 结构是用户定义的类型,结构的声明定义了这种类型的数据属性

    1. 定义了类型之后,就可以创建这种类型的变量

    2. 创建结构分两步:1. 定义结构描述;2. 按照描述创建结构变量

    3. 例子1:定义一个结构

      // 定义结构体
      struct info
      {
          char name[20];
          float stature;
          double weight;
      }
      
      // 使用结构体
      info hat;
      // 使用成员运算符.来访问各个成员
      cout << hat.stature<< endl;
      
      • struct表示定义了一个结构的布局
      • info是类型的名字,相当于int,float这种
      • 大括号内是结构的成员,每一行是一条声明语句
    4. 例子2:在程序中使用结构

      # include <iostream>
      struct info
      {
        char name[20];  // 定义的时候使用分号
        float stature;
        double weight;
       };
       
       int main()
       {
        using namespace std;
        info a1 = 
        {
            "张三",  // 使用的时候,结构中用逗号,不是分号
            1.85,  // 可以写在一行
            90.45,
        };
        
        info a2 = 
        {
            "李四",
            1.78,
            70.56,
        };
        
        cout << "下面是结构a1的信息:" << endl;
        cout << a1.name<< endl;
        cout << a1.stature << endl;
        cout << a1.weight << endl;
        
        cout << "下面是结构a2的信息:" << endl;
        cout << a2.name<< endl;
        cout << a2.stature << endl;
        cout << a2.weight << endl;
        
        return 0;
       }
      
  3. 其他结构属性

    1. 可以将结构作为参数传递给函数,也可以让函数返回一个结构

    2. 例子

      # include <iostream>
      struct info
      {
        char name[20];
        float stature;
        double weight;
       };
       
       // 同时完成定义结构和创建结构变量的工作,(结构定义在main()外面,不然会报错) 
      struct data
      {
        int id;
        char name[20];
      } b1,b2;
         
       int main()
       {
        using namespace std;
        info a1 = {"张三",1.66,70.89};
        cout << "下面是结构a1的信息:" << endl;
        cout << a1.name<< endl;
        cout << a1.stature << endl;
        cout << a1.weight << endl;
        
        info a2;
        a2 = a1;  // 把结构a1直接赋值给a2
        cout << "下面是结构a2的信息:" << endl;
        cout << a2.name<< endl;
        cout << a2.stature << endl;
        cout << a2.weight << endl;
        
        cout << "*****分割线*****" << endl;
        
        data b1 = {6,"李四"};
        cout << "下面是结构b1的信息:" << endl;
        cout << b1.id<< endl;
        cout << b1.name << endl;
        
        data b2 = {7,"王老六"};
        cout << "下面是结构b2的信息:" << endl;
        cout << b2.id<< endl;
        cout << b2.name << endl;
        
        cout << "*****分割线*****" << endl;
        
        // 创建一个包含50个info结构的数组
        info aa[50];
        // 数字aa中的每个元素都是info对象,可以和成员运算符一起使用
        cout << "输入名字:\n";
        cin >> aa[0].name;
        cout << aa[0].name << endl;
        cout << aa[15].stature << endl; // 注意,因为aa本身是一个数组,所以aa.stature这样的操作是无效的 
        return 0;
        } 
      
      • 注意:结构info中包含了一个数组name,那么也可以直接创建一个包含50个info结构的数组
    3. 可以同时创建多个结构对象

      # include <iostream>
      struct info
      {
        char name[20];
        float stature;
        double weight;
      };
       
       int main()
       {
        using namespace std;
        info guest[2] = 
        {
            {"张三",1.85,90.55},
            {"李四",1.78,75.45}
        };
        
        cout << "第一个guest结构:" << endl;
        cout << guest[0].name<< endl;
        cout << guest[0].stature<< endl;
        cout << guest[0].weight<< endl; 
        
        cout << "第二个guest结构:" << endl;
        cout << guest[1].name<< endl;
        cout << guest[1].stature<< endl;
        cout << guest[1].weight<< endl; 
        return 0;
        } 
      
    4. 结构中的位字段

      • 字段的类型应该是整型或者枚举,接下来是冒号,冒号后跟一个数字,这个数字指定的是使用的位数

      • 每个成员被称为位字段(bit field)

      • 例子

        struct register1
        {
            unsigned int SN:4;  // 4bit的SN值
            unsigned int :4; // 4bit 没有使用
            bool goodIn:1; // 输入1bit
            
        }
        

共用体

  1. 共用体(union)是一种数据格式,可以存储不同的数据类型,但是同一时间只能给一种类型赋值,一旦某一种类型赋值了,其他的成员就变成未定义状态了

  2. 共用体的例子

    union one
    {
        int a;
        long b;
        double c;
    };
    
    • 因为共用体每次只能存储一个值,所以它必须有足够的空间来存储最大的成员,所以共用体的长度是其最大成员的长度
  3. 共用体的作用之一,就是当数据使用两种或多种格式的时候,可以节省空间(前提是不能同时使用)

  4. 匿名共用体(anonymous union)没有名字,成员将成为位于相同地址处的变量

    • 例子

      struct widget
      {
          char brand[20];
          int type;
          union // 匿名共用体
          {
              long id_num; // 第一种商品ID,类型是long
              char id_char[20]; // 第二种商品ID,类型是char
          };
      };
      
      widget prize;
      if (prize.type==1)
          cin >> prize.id_num;
      else
          cin >> prize.id_char;
      
      • 共用体是匿名的,所以id_num和id_char是prize的两个成员,地址相同,由用户来确定当前是哪个成员在活动

枚举

  1. 枚举(enum)可以代替const创建符号常量的方式

  2. 例子

    enum colors {red,orange,yellow,green,blue};
    
    • colors称为新类型的名称,它被称为枚举(enum)
    • colors中的red,yellow等被作为符号常量,它们对应的值是0到4,这些常量叫做枚举量(enumerator)
    • 默认情况下将整数值赋给了枚举量
    • colors变量受到限制,只能有5个可能的值(里面定义几个就有几个可能的值)
    • 对于枚举来说,只定义了赋值运算符,没有定义算数运算符
  3. 设置枚举量的值

    • 使用赋值运算符显式的设置枚举量的值

      enum colors {red=1,orange=2,yellow=3,green=5,blue=9};
      
      • 指定的值必须是整数
    • 可以只显式的定义其中一些枚举量的值,没有显式定义的就使用默认的

      enum colors {red,orange=2,yellow=3,green,blue=9};
      
    • 可以创建多个值相同的枚举量

      enum colors {red,orange=0,yellow=3,green,blue=9};
      
      • red和orange的值都是0
  4. 枚举的取值范围

    • 例子

      enum abc{one = 1,two = 2,fout = 100,eight};
      
      • 首先要找出上限,即需要知道枚举量的最大值n,找出n的最小的2的幂,减去1之后就是取值范围的上限,比如abc中最大枚举值是101(没有被初始化的枚举量的值将比其前面的枚举量大1 ),在2的幂中,比这个数大的最小值是128,所以取值范围上限就是127
      • 找出下限,需要知道枚举量的最小值,如果它不小于0,则取值范围的下限是0,否则采用和寻找上限方式相同的方法,但是要加上符号,比如最小的枚举量是-6,那么比它小的,最大的2的幂是-8,所以下限是-7

指针

拓展

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容