美文网首页
Day_03 复合类型

Day_03 复合类型

作者: 安公子_ | 来源:发表于2017-05-01 21:48 被阅读0次

    1.利用cin、cin.get()cin.getline()输入字符串的区别
    iostream中的类cin提供了一些面向行的成员函数:get()和getline()

    • cin
      cin使用空白(空格、制表符和换行符)作为字符串的结束位置,这表明cin只能读取输入队列中的一个单词。
    • cin.getline()
      cin.getline()读取整行,使用enter键入的回车符确定读取结束位置,该函数有两个参数,第一个参数为用于存储字符的数组,第二个参数为字符数组的长度。cin.getline()在读取的字符数目达到第二个参数值时或者遇到换行符时停止读取。丢弃换行符补充\0在字符串尾部。
    • get()
      这个方法有几种形式。讨论其中两种,第一种形式与getline()相似,有两个输入参数,都读取到行尾,但与getline()不同的是,这种方法不再读取并丢弃换行符,而是将其留在队列中。第二种形式无参,读取一个字符(即使是换行符),可以这种方式来处理换行符,为下一行输入做准备。

    例:

    const int strlen = 20;
    char str1[strlen];
    char str2[strlen];
        
    cout << "input using cin:";
    cin >> str1;
    cin >> str2;
    cout << "show the output using cin (string 1st):" << str1 << endl;
    cout << "show the output using cin(string 2en):" << str2 << endl;
    cin.get();//resolve enter
        
    cout << endl;
    cout << "input using getline():";
    cin.getline(str1,strlen);
    cout << "show the output using getline():" << str1 << endl;
    
    cout << endl;
    cout << "input using get():";
    //execute cin.get(str1, strlen) will return a object,this obiect continue to execute get()
    cin.get(str1, strlen).get();
    cout << "show the output using get():" << str1 << endl;
    
    运行结果

    2.string类的操作
    c++中string类的操作可以类比Java中string类的操作,

    • 初始化方式:
    //use c type 
    char ch1[] = { "hello" };
    char ch2[] {"hello"};
    //use c++ type
    string str1 = { "hello" };
    string str2{ "hello" };
    string str3 = "hello";
    
    • 赋值、拼接和附加
    //apend string to other string object
    str4 = str1 + " world " + str2;
    str4 += str3 + "  hi! ";
    
    • string类的其他操作
    strcpy(str1,str2);//copy str2 to str1
    strcat(str1,str2);//apending str2 to str1
    strlen(str);//length of string object
    
    • getling()在两种场合的使用
        char ch[20];
        string str;
        /*
        **此处,getline()为类istream中对象cin的成员方法,传入的参数为字符串指针和字符的限制
        */
        cin.getline(ch,20);
        /*
        **此处,getline()为类istream的成员方法,传入的参数为cin对象和string对象
        */
        getline(cin, str);
        cout << ch << endl;
    
    • 原始字符串
      原始字符串即表示字符本身,如\n就是\n,而不表示换行。其表达式为:
    //语法:strSelf = R“(string object)”
    cout << R"(i am a man."\n" instead of endl)" << endl;
    
    • 结构体struct
      定义
    struct student {
            string name;
            int years;
            double heigh;
        };
    

    初始化

    struct student zhang;//c style 
    student li;//c++ style
    c++ style initialized student li
    student li = { "dsds", 1994, 173.0 };
    student li  { "dsds", 1994, 173.0 };
    cout << li.name << endl << li.years << endl << li.heigh;
    
    • 结构体中成员可以为类(如string),可以创建数组(类似基本数据类型数组的创建方法)
    • 共用体(union)
      共用体是一种数据格式,可以存储不同的数据类型。但只能同时存储其中的一种类型。假如结构体只能同时存储intdouble,共用体则只能存储一种,intdouble
      定义:
    union num{
        int n;
        double m;
    };
    

    在不同的时间可以存储不同类型的数据,如:

    num ID;
    ID.n = 12;
    //restore int and double in difference time
    cout << ID.n << endl;
    ID.m = 12.12;
    cout << ID.m << endl;
    
    • 数组的替代品
      1.模板类vecter
      模板类vecter类似于string类,也是一种动态数组。可在运行阶段设置vecter长度,可在末尾附加新数据,可在中间加入新数据。可以说它是用new和delete来处理动态数组的替代品。创建一个名为vt的vecter对象且可存储类型为typeName的定义方式为:
      vecter<typeName> vt(elem)
      2.1.模板类array
      vecter功能强大,但是效率低。如果需要固定长度的数组。可以使用模板类array,array对象的长度是固定的。创建一个名为arr的array对象,它包含n_elem个类型为typeName的元素:
      vecter<typeName,n_elem> arr
    • new和delete
      使用指针时,一定要首先对指针初始化,下述做法不可为:
    //指针a指向何处,不得而知
        int *a;
        *a = 1;
    

    c++引入了关键字来克服这种问题,提供了一种可以绕过定义变量而直接通过指针操作数据的方法,即通过new关键字为指定类型的数据分配内存(c中为molloc()函数),并提供一个指向该存储单元的指针。其格式为:
    typeName *pointerName = new typeName
    例如:

    //使用解引用(*)指针是,一定要对指针初始话
    //使用new关键字寻求一个适合存储int数据的内存
    int *p = new int;
    

    值得注意的是,通过new关键字是从堆(heap)或自由空间(free store)中获取存储单元;而直接定义的变量是从栈(stack)中获取存储单元。
    new一定要和delete配合使用,使用delete可以释放被定义是分配的存储空间,但不会删除指针本身。如:

    int *p = new int;
    delete p;
    

    1.使用new创建动态数组
    typeName *pointerName = new typeName[element_num]
    使用delete删除动态数组
    delete [] pointerName
    2.创建结构体的两种方式

    struct infinite {
            int a;
            float b;
        };
    //第一种初始化结构体的方式,需要在定义时初始化
    infinite first = {1,1.2};
    infinite first { 1, 1.2 };
    //访问方式,利用操作符“.”访问成员
    int a = first.a;
    float b = first.b;
    //第2种动态初始化结构体的方式,不用在定义时初始化,利用指针指向该存储空间,操作符“->”访问成员
    infinite *second = new infinite;
    second->a = 1;
    second->b = 1.2;
    

    相关文章

      网友评论

          本文标题:Day_03 复合类型

          本文链接:https://www.haomeiwen.com/subject/yjyftxtx.html