C++__自定义数据类型

        C++除了提供多种基本的数据类型(intfloatdoublechar)供用户使用外,还允许用户根据需要自己声明一些类型,例如数组、结构体(structure)类型、共用体(union)类型、枚举(enumeration)类型、类(class)类型等,这些统称为用户自定义类型(user-defined type,UDT)
1  结构体类型

C++将用户自己指定的、包含有若干个类型不同或相同数据项的这样一种组合项数据类型称为结构体

        声明一个结构体类型的一般形式为:

                    struct  结构体类型名

                  {成员列表};

    声明结构体类型的位置一般在文件的开头,在所有函数(包括main函数)之前,以便本文件中所有的函数都能利用它来定义变量。当然也可以在函数中声明结构体类型。

        C++结构体的成员既可以包括数据(即数据成员),又可以包括函数(即函数成员),以适应面向对象的程序设计。但是由于C++提供了类(class)类型,因此,一般情况下,结构体只含有数据成员而不带函数。

结构体类型变量的定义方法及其初始化

        声明的结构体类型相当于一个模型,它没有具体的数据,系统也不为其分配实际的内存单元。为了能在程序中使用结构体类型的数据,应当定义结构体类型的变量,并在其中存放具体的数据。

      1. 定义结构体类型变量的方法 3种)

     1) 先声明结构体类型再定义变量名

   (2) 在声明类型的同时定义变量

      定义的一般形式为

                     struct  结构体名

                     {       成员列表

                     }   变量名列表;

(3) 直接定义结构体类型变量

      定义的一般形式为

        struct

        {       成员列表

        } 变量名列表;
  • 不要误认为结构体类型都有相同的结构。实际上,每一种结构体类型都有自己的结构。
  •         类型与变量是不同的概念,不要混淆。只能对结构体变量中的成员赋值,而不能对结构体类型赋值。在编译时,是不会为类型分配空间的,只为变量分配空间。
  •         对结构体中的成员,可以单独使用,它的作用与地位相当于普通变量。
  •          结构体中的成员名可以与程序中的变量名相同,但二者没有关系。
    •         ⑤ 结构体中的成员也可以是一个结构体变量。
    •        2. 结构体变量的初始化
3 结构体变量的引用
        (1) 可以将一个结构体变量的值赋给另一个具有相同结构的结构体变量。

  student1= student2;

        (2) 可以引用一个结构体变量中的一个成员的值。引用结构体变量中成员的一般方式为

                                结构体变量名.成员名

  student1.num=10010;

        (3) 如果成员本身也是一个结构体类型,则要用若干个成员运算符一级一级地找到最低一级的成员。
  student1.birthday.month
        (4) 不能将一个结构体变量作为一个整体进行输入和输出。只能对结构体变量中的各个成员分别进行输入和输出。

   cout<不合法

   cout<合法

        (5) 对结构体变量的成员可以像普通变量一样进行各种运算(根据其类型决定可以进行的运算种类)。

   sumstudent1.scorestudent2.score;     

   student1.age++

        (6) 可以引用结构体变量成员的地址,也可以引用结构体变量的地址。

   cout<<&student1;                   //输出student1的首地址

   cout<<&student1.age;            //输出student1.age的地址
  • 结构体数组
    •     1.定义结构体数组

         struct Student                         //声明结构体类型Student

         {    int num;

              char name[20];

              char sex;

              int age;

              float score;

              char addr[30];

         };

         Student stu[3];                        //定义Student类型的数组stu
    • 2. 结构体数组的初始化

      stu[3]={{10101,″Li Lin″,′M′,    //可以不指定元素个数

                         18,87.5, ″103 Beijing Road″},

                        {10102,″Zhang Fun″,′M

                         19,99,″130 Shanghai Road″},

                        {10104,″Wang Min″,′F′,

                         20,78.5,″1010,Zhongshan Road″}};

  • 5 指向结构体变量的指针

    一个结构体变量的指针就是该变量所占据的内存段的起始地址。可以用一个指针变量来指向一个结构体变量,此时该指针变量的值是结构体变量的起始地址。也可以用指针变量来指向结构体数组中的元素。

            1. 通过指向结构体变量的指针引用结构体变量中的成员
         2. 用结构体变量和指向结构体变量的指针构成链表
        •        链表是一种常见的重要的数据结构。下图表示了最简单的一种链表(单向链表)的结构。
            •        C++__自定义数据类型_第1张图片         
                  链表有一个“头指针”变量,一般以head表示,它存放一个地址,该地址指向一个元素。
               链表中的每一个元素称为“结点”,每个结点都应包括两个部分: 用户需要用的实际数据下一个结点的地址

结构体类型数据作为函数参数

      将一个结构体变量中的数据传递给一个函数的方法有下列3种:

      (1)  用结构体变量名作参数。一般较少用这种方法。

      (2)  用指向结构体变量的指针作实参,将结构体变量的地址传给形参。

     
(3) 
用结构体变量的引用变量作函数参数。

       说明

        ①   用结构体变量作实参和形参,程序直观易懂,但效率不高。

        ②   用指针变量作为实参和形参,空间和时间的开销都很小,效率较高,但程序不直观。

        ③  用结构体变量作实参,而用结构体类型的引用作形参,虚实结合时传递的是stu的地址,因而效率较高。它兼有前两种形式的优点。
7 动态分配和撤销内存的运算符newdelete

        在软件开发过程中,常常需要动态地分配和撤销内存空间(如动态链表中结点的插入与删除)。在C语言中是利用库函数mallocfree来分配和撤销内存空间的。而C++提供了较简便而功能较强的运算符newdelete来取代mallocfree函数。

        注意 newdelete是运算符,而不是函数,因此执行效率高。

          new运算符的一般格式为

                                    new 类型 (初值)

delete运算符的一般格式为

                             delete 指针变量  

  或                      
delete [ ]
指针变量

说明

        ①  用new分配数组空间时不能指定初值。

        ②  new所开辟的存储空间,只能通过new返回的一个指向所分配空间的地址进行访问,而无法直接通过变量名进行访问。

        ③  如果由于内存不足等原因而无法正常分配空间,new会返回一个空指针NULL,用户可以根据指针的值判断分配空间是否成功。
 2 共用体(只能使用其中的一个,长度取最长的那个变量)

  1 共用体的概念

        几种不同类型的变量从同一地址开始存放,共同占用同一段内存单元的结构,称为共用体(union)类型的结构。

声明共用体类型的一般形式为

    union 共用体类型名

    {成员列表

      };

       定义共用体变量的一般形式为

                         共用体类型名 共用体变量名
说明共用体”与“结构体”的定义形式相似,但结构体变量所占内存长度是各成员占的内存长度之和。每个成员分别占有其自己的内存单元。共用体变量所占的内存长度等于最长的成员的长度。

对共用体变量的访问方式

         不能把共用体变量作为一个整体引用,而只能引用共用体变量中的成员。

共用体类型数据的特点

        (1)  使用共用体变量的目的是希望用同一个内存段存放几种不同类型的数据。但请注意: 在每一瞬时只能存放其中一种,而不是同时存放几种。

        (2)  能够访问的是共用体变量中最后一次被赋值的成员,在对一个新的成员赋值后原有的成员就失去作用。

        (3)  共用体变量的地址和它的各成员的地址都是同一地址。

        (4)  不能对共用体变量名赋值;不能企图引用变量名来得到一个值;不能在定义共用体变量时对它初始化;不能用共用体变量名作为函数参数。
 3 枚举类型

        如果一个变量只有几种可能的值,可以定义为枚举类型(enumeration) 所谓“枚举”是指将变量的值一一列举出来,变量的值只能在列举出来的值的范围内

         声明枚举类型的一般形式为

                   enum  枚举类型名  {枚举常量列表};

enum weekday{sun,mon,tue,wed,thu,fri,sat};

          定义枚举变量的一般形式为

                          枚举类型名  枚举变量名;

       说明:

        (1)  对枚举元素按常量处理,故称枚举常量。

        (2)  枚举元素作为常量,它们是有值的,C++编译按定义时的顺序对它们赋值为0,1,2,3,…。也可以在声明枚举类型时另行指定枚举元素的值。

        (3)  枚举值可以用来做判断比较。

        (4)  一个整数不能直接赋给一个枚举变量。
 4typedef声明类型
typedef是用来声明一个新的类型名以代替已有的类型名。

     typedef int INTEGE;      //用标识符INTEGER代表int类型

         INTEGER i,j;               //等价于int i,j;

         说明:习惯上常把用typedef声明的类型名用大写字母表

示,以便与系统提供的标准类型标识符相区别。

        (1)  typedef可以声明各种类型名,但不能用来定义变量。用typedef可以声明数组类型、字符串类型,使用比较方便。

        (2)  typedef只是对已经存在的类型增加一个类型名,而没有创造新的类型。

        (3)  当在不同源文件中用到同一类型数据(尤其是像数组、指针、结构体、共用体等类型数据)时,常用typedef声明一些数据类型,把它们单独放在一个头文件中,然后在需要用到它们的文件中用#include命令把它们包含进来,以提高编程效率。

        (4)  使用typedef有利于程序的通用与移植。有时程序会依赖于硬件特性,用typedef便于移植。

你可能感兴趣的:(C++学习)