C++ PP chapter Ⅳ 复用类型

0.三种复合类型: 数组、结构、指针
1.数组被称为复合类型
        数组声明应当指出三点:
                    a.存储在每个元素中的值的类型(typeName)
                    b.数组名(arrayName)
                    c.数组中的元素数(arraySize)
        声明数组的通用格式:
                    typeName arrayName[arraySize]


2.让编译器确定数组大小
        例如:
            a. int things = sizeof things / sizeof (short)
            b. int num[] = {1,2,3};
            c. char str[] = "I hate C++11"


3.字符串输出的拼接
        使用两对引号进行分行拼接
        例如:
            cout << "I'd give my right ar"
            "m to be a great violinist"<<endl;


4.cin读取字符串规则
        [普通的]cin使用空白符(空格、制表符、换行符)来确定字符串的结束位置
        并且会自动在字符串结尾添加空字符,但是会把空白符遗留在缓冲区!


5.cin面向行的类成员函数
        Ⅰ. getline()
            该函数读取整行,以换行符来确定输入结尾
            调用方法 cin.getline(),有两个参数,数组名,和最多读取的字符数(有回车直接停止)
            例如:
                cin.getline(Name,20);//最多会读取19个字符!最后一个自动加空白符
            注:getline 会读取缓冲区换行符并丢弃,在字符串后加空白符
            连续读取方法
                例如: cin.getline(name1,Size1).getline(name2,Size2);//连接合并

        Ⅱ. get()
            带参数的get似getline,但是会留换行符在缓冲区
            不带参数的get会读取下一个字符(包括换行)
            连续读取方法
                例如: cin.get(name,Size).get();//连接合并


6.string 类
        使用string对象的方式与使用字符数组相似
        string可以自动处理大小,0
            例如: string str = "panther";
                   string strB; cin>>strB;
        操作:
                a. 赋值、拼接、附加         //对于C-风格需要用 strcpy() 和 strcat()函数
                    一个string对象可以直接赋值给另一个string对象
                        例如: str2 = str1;
                    可以用运算符 + 使得两个string对象合并
                        例如: str3 = str1 + str2;
                    可以附加到string对象的结尾
                        例如:str1 += str2;

                b. string 类的其他操作
                    具有自动调整大小功能!

                c.string 类I/O
                    要注意的是读取一行时,使用方法:  getline(cin,strName); //涉及到更深的内容,本章未讲


7.结构体
        a. C++允许typedef省略
            例如:
                struct inflatable
                {
                    char name[20];
                    float volume;
                    double price;
                    std::string test;//可以使得string类成为成员
                };
        b. C++对结构体的初始化
            例如:
                inflatable guest =
                {
                    "Glorious Gloria",  //name value
                    1.88,               //volume value
                    29.99               //price value
                };
                可写在同行 inflatable duck = {"Daphne",0.12,9.98};

            补: C++11
                        I . 允许初始化时 = 缺省
                                inflatable duck {"Daphne",0.12,9.98};
                        II. 各个成员设置为0
                                inflatable mayor {};//inflatable mayor = {};

        c. 结构体数组的初始化
            例如:
                inflatable guests[2] =
                {
                    { "Bambi",0.5,21.99},
                    { "Tony",2000,562.5}
                };


8.共用体(union)
        能够同时存储不同的数据类型,但是只能同时存储其中的一种类型(某时刻只有一个合法的类型变量),句法与结构体相似,但含义不同
        共用体的长度为其最大成员的长度
        此处只总结一种常用的 匿名共用体
        例如:
            struct widget
            {
                char brand[20];
                int type;
                union (缺省A)
                {
                    long id_num;
                    char id_char[20];
                }(缺省B);
            };
            ...
            widget prize;
            ...
            if(prize.type) cin >> prize.id_num; //使得无需经过变量名B
            else cin >> prize.id_char;


9.枚举(enum//只定义了赋值运算符
        例如:
           创建新类型: enum spectrum {red,orange,yellow,green};//red,orange..被称为符号常量,对应整数值0~3
                       可以显式的设置枚举量的值 enum Test {red = 2,orange = 4};
           声明变量  : spectrum band;
           赋值      : band = red; 
                       band = orange + 1;//等价于  band = yellow
                       不合法的赋值: band = 0//不合法
                       赋的值应该是符号常量
           如果int值是有效的,可以通过强制转换来赋值给变量:
                        band = spectrum(2);

10.指针和自由存储空间(heap 堆)
        a. cout显示地址时是16进制数
        b. 用 new 来申请内存,返回的是地址
            格式:
                typeName * pointer_name = new typeName
        c. 用 delete 来释放内存
            格式:
                delete pointer_name
        d. 动态数组的创建与释放
            格式:
                typeName * pointer_name = new typeName[num_elements]
            下面两组应当对应

                int * pt = new int;
                delete pt;

                int Size; cin >> Size;
                int * ps = new int [Size];
                delete [] ps;//否则只是释放了指针指向的元素

            注: 对动态数组的地址变化
                例如: ps = ps + 1 ,那么 ps[0] 便为原来的 ps[1]
11.三种储存方式:
    a.自动储存 auto 
    b.静态储存 static
    c.动态储存 newdelete

12.数组的替代品

        Ⅰ. 模板类 vector
                格式:
                    vector<typeName> vt(n_elem)
        Ⅱ. 模板类 array (C++11)
                格式:
                    vector<typeName,n_elem> arr

        注:都可用标准数组法来访问每个元素,其中array和数组一样存放在栈(stack)中,
            而vector 存放在堆(heap)中
        两中访问方式 vt[21] 等价于 vt.at(21) 但是使用成员函数at() 会花费更多的时间检测是否合法

vector 使用方法 http://blog.csdn.net/hnust_V/article/details/51917852
string 使用方法 http://blog.csdn.net/hnust_v/article/details/51916666

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值