Day_03 复合类型

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;
Day_03 复合类型_第1张图片
运行结果

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 vt(elem)
    2.1.模板类array
    vecter功能强大,但是效率低。如果需要固定长度的数组。可以使用模板类array,array对象的长度是固定的。创建一个名为arr的array对象,它包含n_elem个类型为typeName的元素:
    vecter 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 复合类型)