C++的内部数据类型只是一些简单的类型,如整数和浮点数。在实际问题中常会涉及大量的复合数据,这些复合数据就需要我们自定义的数据结构来描述。在本章将讨论如保创建合适的数据类型,以适应具体的问题,以及一些面向对象的概念,包括什么是对象、类。结构的使用联合和枚举类和对象类的成员构造函数析构函数类的私有成员C++/CLI的数值类C++/CLI的引用类C++/CLI的类属性C++的内部数据类型只是一些简单的类型,如整数和浮点数。在实际问题中常会涉及大量的复合数据,这些复合数据就需要我们自定义的数据结构来描述,最初的自定义数据结构就结构类型。定义结构访问结构成员结构与指针结构也是将多种数据类型结合在一起的复合数据类型。例如,下面定义的结构使用三个整型数据表示时间:structTime{inthour;//0~23intminute;//0~59intsecond;//0~59};关键字struct表明定义的是一个结构,标识符Time是定义的结构名。在大括号之间声明的变量都是该结构的成员。同一结构内的成员应有惟一名称,两个不同结构可以包含同名成员而不会冲突。每个结构定义应该以分号结尾访问结构的各个成员,需要使用成员选择运算符“.”。要访问结构的某个成员,可以先列出结构变量名,然后是“.”和希望访问的成员名。例如,如果要访问Time结构的hour成员,可以使用下列语句:timeObj.hour=12;与普通变量一样,也可以创建一个指向结构类型的指针变量,避免给函数传递结构时复制整个结构的系统开销。例如,下面定义了一个描述图书的结构类型Book:structBook{chartitle[50];//图书名称charauthor[30];//作者charpublisher[50];//出版商intyear;//出版日期intpages;//页码intprice;//价格};间接运算符“*”与指针变量一起使用。在使用变量时,可以直接访问其中存储的数据,而通过指针变量访问数据时,首先需要获取指针变量中存储的数据地址,然后再根据该地址访问数据,这也就是为什么称为间接运算符。联合与结构有一些相似之处,但两者有本质上的不同。结构的各个成员都有各自的内存空间,一个结构变量的总长度是各成员长度之和。而在联合中,各成员共享一段内存空间,一个联合变量的长度等于成员中最长的长度。定义联合的方式与结构类似,只需要使用关键字union替换struct即可。例如,下面的的定义了一个联合:unionData{intiVal;doubledVal;};这个语句定义了一个名为Data的联合类型,它包含有两个成员,一个为int成员,一个为double型成员。这个语句很像结构的声明,实际上,它就是一种结构,只是所有的成员都占用相同的内存内间C++支持匿名联合,即:定义一个没有确定类型的无名类型。对于这种匿名联合,程序将自动声明该联合的一个变量。例如:union{intiVal;doubledVal;};该语句不仅定义了一个匿名联合,还创建了该联合的一个变量,该变量也没有名称。因此,只需要使用联合中定义的成员名iVal和dVal,就能引用该变量包含的成员。在实际问题中,有些变量的取值被限定在一个有限的范围内。例如,一个星期内只有七天,一年只有十二个月等等。如果把这些量说明为整型,字符型或其它类型显然是不妥当的。为此,C++提供了一种称为“枚举”的类型。在“枚举”类型的定义中列举出了所有可能的取值,该“枚举”类型变量的取值只能是枚举定义的范围。C++有个最大的特点就是它是面向对象的编程语言。面向对象编程提供了一种强大的编程方式,它强调使用类和对象来编写程序,其本质是根据要解决问题范围内所涉及到的对象来编写程序。类也是用户自定义的数据类型,它由两部分组成:数据和函数。组成类的数据和函数也称为类的成员,数据部分称为数据成员;函数部分则称为函数成员或成员函数。有的地方也称类的成员函数为方法,数据成员为字段。C++使用关键字class来定义类。其基本结构如下:classclass_name{//类成员};关键字class表示这里定义的是一个类,其后面是类的名称,一般首字符用大写字母。在大括号之间可以添加该类的数据成员和函数成员,整个类定义以分号结束。在定义一个类后,就可以创建该类的一个实例,或对象。创建类的对象与声明基本类型变量的方法完全相同。例如,下面的语句创建了Cube类的两个对象:intmain(){Cubecube1;Cubecube2;return0;}创建的两个Cube类对象它们的结构相同,都有三个数据成员。但是对象的数据成员都没有包含任何值,因此还需要访问对象的数据成员,以向其数据成员赋值。访问类的数据成员与访问结构的成员的方法一样,当要访问对象的某个成员时,只需要在对象名后使用成员访问运算符“.”和希望访问的成员名。类的成员函数是那些在类的内部声明或定义函数,它们作用类的内部成员,可以访问本类内所的成员。在类内部定义的成员函数称为内联函数,可以使用inline关键字标识,也可以省略。内联函数的规模一般较小,语句只有1到5句。对于较大的成中函数而言,直接把代码放在类定义中使用起来十分不方便。为了避免这种情况,C++允许在类的外部定义函数,并将函数的原型放在类的内部,表示该函数是类的成员函数。对于普通变量,在声明就可以对其进行初始化,对于数组、指针变量也可以在声明时初始化。那么在创建类的对象时,如何实现对其初始化呢?这就需要使用类的构造函数。构造函数的使用类的默认构造函数默认的初始化值构造函数中的初始化列表类的构造函数是类的一个特殊成员函数,它在创建类的对象时被自动调用。因此,可以在构造函数中对类的数据成员进行赋值,实现在创建类的对象时对各数据成员进行赋值。C++规定,与类同名的成员函数就是构造函数。例如,Cube类的构造函数必须为Cube()。构造函数没有任何返回类型,即使写为void也是不允许的。在创建类的对象时,会自动调用构造函数。如果没有为类定义构造函数,是否还会调用构造函数呢?事实上,如果没有为类定义构造函数,则编译器会提供一个默认的构造函数,用于创建类的对象。默认的构造函数没有参数的构造函数。在声明类时,只要没有为类定义构造函数,则编译器就会自动提供一个默认的构造函数。可是如果为类提供了构造函数,则编译器就会认为该构造函数就是默认的构造函数,因此不再提供构造函数。在C++中可以为函数中的参数指定默认值,同样也可以为类的成员函数指定参数的默认值,包括类的构造函数。如果类的成员函数为内联函数,则可以把参数的默认值放在函数头中。如果类的成员函数是在外部定义,则参数的默认值只能放在函数的声明中,而不应该在函数的定义中。以前,大部分使用显示赋值语句在构造函数中初始化对象的成员。现在可以使用另一种初始化技术——初始化列表。下面使用初始化列表对Cube进行初始化:Cube::Cube(doublelength,doublewidth,doubleheight):m_Length(length),m_Width(width),m_Height()height{cout调用构造函数endl;}这种方法假设构造函数位于类定义的内部。现在,数据成员的数值不是在函数内的赋值语句中设定的。因为在声明中使用功能符号指定了初值,这样可能会比使用赋值语句的效率高。一个类可能在构造函数中分配资源,当创建该类的对象时就会该对象分配资源。如果不再需要该对象时,应该释放为其分配的资源。例如,如果构造函数从堆中动态分配了内存,这块内存在对象消失之前必须被释放,这就是析构函数的作用。析构函数也是特殊的类成员函数,它没有返回类型,没有参数,不能被随意调用,也不能进行重载,当类对象不再有效时由系统自动调用。类的析构函数与类名相同,只是在类名前加个否定号“~”。使用构造函数为类的数据成员赋值的一个目的就是要确保对象的所有数据成员都被设置为合适的值。类的私有成员只能被类的成员函数访问,如上面的Volume()函数就可以访问私有成员。如果需要从外部访问类的私有成员,则可以提供一些公有的函数,在这些公有的函数中提供对私有成员的访问。这些公有的函数或数据成员也称为类的接口,因为它们可以提供包括private成员在内的所有类成员的间接访问。C++/CLI中的枚举与ANSIC++程序不同。首先,在C++/CLI中定义一个枚举的语法格式如下:enumclassColor{Red,Green,Yellow,Blue,Orange};这个语句定义了一个枚举类型Color,Color类型的变量只能被赋予这个枚举定义的一个值。在访问C++\CLI枚举中的常量时,即终必须利用枚举类型名称限定正在使用的常量。例如:Colorcolor=Color::Blue;定义枚举中的关键字class表示枚举常量是对象,而不像ANSIC++枚举中那样仅仅是基本数据类型。实际上,在默认情况下,它们是Int32类型的对象。由于C++/CLI枚举是一种类类型,因此不能从局部定义它,如不能在一个函数内定义它。C++/CLI有自己的class类型,C++/CLI提供了两种不同特性的class类型,一种是数值类valueclass类型,另一种是引用类refclass类型。数值类类型的对象包含有它自己的数据,在前文中曾介绍过,像int和double这样的基本数据类型名在CLR程序中都是数值类类型的简写。而引用类类型在功能上相当于本地C++类。数值类型是一种轻量级的C++/CLI类机制,非常适合于有限个数据成员的简单对象,且从语义的角度来看,与数值(Value)类似。引用类类型在功能上相当于本地C++类。定义引用类与数值类相似,只是需要使用refclass关键字替换valueclass关键字。在C++/CLI中,数值类和引用类都可以有属性。属性是一种特殊的函数,它可以像某个数据成员或字段一样通过名称访问,但它实际上则是调用一个函数。事实上,类的属性以分为两种:标量属性和索引属性。下面分别给予介绍。1.标量属性2.索引属性