• C++复合类型


    3种复合类型:

      数组、结构、指针

    1 数组

      声明数组: 

    short months[3] = {0,1,2};

      创建数组:

      数组初始化规则:

        默认元素的值为0

        如果元素个数为空,编译器会计算元素个数。

      数组初始化方法:

        可以省略=

        {}中可以没有内容

        不能缩窄转换:类型失去精度、超过取值范围等
      模板类:

        vector、array

    2 字符串

      C++处理字符串的方式:

        1是C-风格字符串:以空字符结尾

        2是string类库

    char cat[4] = {'c','a','t',''};
    char cat[] = "cat";

          数组初始化为字符串

          字符串常量和字符常量不能互换。

          如:char s = 'S',是83的另一种写法;只有单个字符;

            char s = "S",错误表示,"S"表示字符串所在的内存地址;由字符S和字符组成

      拼接字符串:

        空白(空格、制表符、换行符)

      数组使用字符串:

        1是将数组初始化为字符串常量

          char name[2] = "xm";

        2是将键盘或文件输入读入到数组中

          一个单词

          char name1[2];

          cin >> name1;//使用空白(空格、 、 )确定字符串结束的位置;长度可能大于目标数组;仍然留有换行符,所以需要在读取地址之前先读取并丢弃换行符。

          cin.get();

          或者:(cin >> name1).get();

        strlen()是数组中字符串的长度,只计算可见字符,不包含空字符。

    使用截断字符串

          一个句子

            cin.getline(name, 20):通过回车键输入的换行符确定输入结尾。

            cin.get(name, 20).get():第一次换行符留在输入队列;再次无参数cin.get()认为已到达行尾。

          拼接:

            cin.getline(name, 20).getline(name1, 20);  

          空行或其他问题:

            输入空行后,get()会设置失效位,接下来的输入被阻断,使用cin.clear()恢复

            输入字符串大于分配空间,Dgetline()会设置失效位,关闭后面的输入。

      混合输入字符串和数字:

          在读取地址之前先读取并丢弃换行符即可。     

    3 String

      可以使用C-风格字符串来初始化string对象、可以使用cin将键盘输入存储到string对象中、可以使用cout来显示对象、使用数组表示法访问存储在string对象中的字符。

      string相比数组:

        更方便,更安全(长度)。

        可以将一个string对象赋给另一个string对象,数组不可以。

      string拼接:

        +

        +=

      其他操作:

        strcpy(charray, string)//字符串复制到字符数组

        strcat(char1, string)//字符串附加到字符数组末尾

        str.size();//长度

        strlen(str);//长度,如果第一个空字符的出现位置是随机的,则数组长度可能和给定的不同。

        新的一行:getline(cin, str);没有指出字符串长度的参数,string对象会自动调整大小。

      字面值:

        原始字符串:"( )" 用作定界符,并使用前缀R来标识。使用R"+*( )+*"标识开头和结尾。

        标准字符串时:需要使用来转义。

    4 结构 

      struct关键字

      用户自定义的类型,结构声明定义了数据属性。 

         结构描述的组成部分

      外部声明和内部声明:

        

      注意:

        不提倡使用外部变量,但提倡使用外部结构声明。

        可以使用赋值运算符将结构赋给另一个同类型的结构。

        结构名称可以省略,直接创建结构变量,但是不推荐。

        结构成员可以指定占用的特定位数,这个成员被称为位字段。

      结构数组:

        数组的元素为结构;

    5 共用体

      union关键字

      能够存储(声明)不同的数据类型,但是只能同时存储其中的一种,所以长度为最大成员的长度;

      常用于操作系统数据结构或硬件数据结构。

      作用:

        使用多种格式时,可以节省空间;

      匿名共同体(anonymous union)

        没有名称

    6 枚举

      enum工具,可以代替const,允许定义新类型;

      默认情况,将整数值赋给枚举量;会递增枚举量的值;枚举量的值可以取取值范围内的数;

      取值范围:最大值:大于最大值、最小的2的幂,减1;最小值:大于0时:0;小于0时:类似于最大值;

      枚举名可以声明变量,

      只定义了赋值运算符,没有算术运算。

      枚举可以转换为int,但是int不能转换为枚举。

      枚举常被用来定义相关的符号常量,而不是新类型。

    7 指针

      存储的是值的地址;常规变量的地址为派生量。

      显示地址:&,十六进制表示法;

          定义指针,*为间接值或者解除引用运算符。

      OOP:强调运行阶段(动态联编 dynamic binding)。使用new请求正确数量的内存以及使用指针跟踪新分配的内存的位置。

      

    硬币的两面表示变量和指针变量  

      指针声明必须指定指针指向的数据的类型:

        字节数不同,内部格式不同,

        

    指针存储地址

        注意:

          地址的长度或值不能指示关于变量的长度或类型的任何信息,也不能指示该地址上有什么内容。

          创建指针时,计算机会分配用来存储地址的内存,不会分配用来存储指针指向的数据的内存。如果初始化指针变量时,会导致一些bug。

          指针描述的是位置,不知道对应的值的类型,强转时可能出现问题。

        new分配内存:

          指针真正用于在运行阶段分配未命名的内存已存储值。

          int *pn = new int;

          程序员告诉new,需要为哪种数据类型分配内存;new将找到一个长度正确的内存块,并返回该内存块的地址。将地址赋给指针。但是pn指向的内存没有名称时,pn指向一个数据对象(东西)即为数据项分配的内存块。

          常规变量的值被存储在栈的内存区域中,new则是从堆或者自由存储区的内存区域分配内存。

          当计算机内存不足时,new会引发异常。
        delete释放内存:

          使用完内存后,可以使用delete将内存归还或释放给内存池。但是不会删除指针本身。可以通过new重新给指针分配内存,否则内存泄露。

          声明变量(没有new)的指针不能使用delete释放。

        new创建动态数组:

          new真正应用于大型数据:数组,字符串和结构;      

          int *psome = new int[10];//返回第一个元素的地址,指向内存块中的第一个元素。

          delete [] psome;

          使用new和delete的规则:

          访问元素时:指针可以当数组名,psome[1]即可。

          psome+1:指针psome增加的是指向的类型的字节数,所以指向下一个元素。即取值时取到下一个位置的值。

    8 指针、数组和指针算术

      指针和数组基本等价的原因:指针算术和内部处理数组的方式。  

      指针值可以修改,数组名是常量,被解释为第一个元素的地址,整个数组的地址是&。

      sizeof,指针数组是指针的长度,变量数组是数组的长度。

      C++将数组名解释为地址。

       指针加法

      new创建动态结构:

          运行时为结构分配所需的空间。new用于结构由创建结构和访问成员组成。

          inflatable *ps = new inflatable;

          成员运算符句点不能用于结构名。结构没有名称,只知道地址。使用运算符:->,用于指向结构的指针。ps -> price 是被指向结构的price成员。

          或者:(*ps).price//*ps是结构本身。      

          标识结构成员    

      自动存储、静态存储和动态存储:

        C++管理数据内存的方式:

          自动存储、静态存储和动态存储、线程存储

        自动存储:函数内部定义的常规变量使用自动存储空间,被称为自动变量(局部变量)。函数调用时自动产生,函数结束时消失。存储在栈中。

        静态存储:变量在函数外定义;声明变量时使用static。

        动态存储:new和delete运算符。可以在一个函数中分配内存,另一个函数中释放。但是自由存储可能不连续,跟踪新分配内存的位置时困难。

    9 数组的替代品vector和array

      vector

        动态数组,包含在std中,堆

      array

        长度固定,栈,一个array对象可以赋给另一个array对象

      两者使用at()时捕获索引异常,程序默认中断。

           

          

        

  • 相关阅读:
    帝国cms字母导航功能制作教程
    HTML 学习
    DOM
    C# DataTable 使用原创
    GridView中编辑状态下实现DropDownList默认值(原创)
    C#精髓 GridView72大绝技(清清月儿)
    SQL注入攻击<收藏>
    Web网页安全色谱<收藏>
    GridView根据linkButton值不同跳转不同页面(原创)
    解决"Failed to access IIS metabase"
  • 原文地址:https://www.cnblogs.com/Z-D-/p/12369639.html
Copyright © 2020-2023  润新知