visual studio学习第8章 自定义数据类型
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
访问结构的各个成员,需要使用成员选择 运算符“.”。要访问结构的某个成员,可以 先列出结构变量名,然后是“.”和希望访问 的成员名。例如,如果要访问Time结构的 hour成员,可以使用下列语句: timeObj.hour=12;
与普通变量一样,也可以创建一个指向结构类型的指针 变量,避免给函数传递结构时复制整个结构的系统开销。 例如,下面定义了一个描述图书的结构类型Book: struct Book { char title[50]; //图书名称 char author[30]; //作者 char publisher[50]; //出版商 int year; //出版日期 int pages; //页码 int price; //价格 };
C++支持匿名联合,即:定义一个没有确定类型的无名类 型。对于这种匿名联合,程序将自动声明该联合的一个变量。 例如: union { int iVal; double dVal; }; 该语句不仅定义了一个匿名联合,还创建了该联合的一个 变量,该变量也没有名称。因此,只需要使用联合中定义的 成员名iVal和dVal,就能引用该变量包含的成员。
C++有个最大的ቤተ መጻሕፍቲ ባይዱ点就是它是面向对象的编程语言。面向 对象编程提供了一种强大的编程方式,它强调使用类和对象 来编写程序,其本质是根据要解决问题范围内所涉及到的对 象来编写程序。
类也是用户自定义的数据类型,它由两部分组成:数据和 函数。组成类的数据和函数也称为类的成员,数据部分称为 数据成员;函数部分则称为函数成员或成员函数。有的地方 也称类的成员函数为方法,数据成员为字段。 C++使用关键字class来定义类。其基本结构如下: class class_name { //类成员 }; 关键字class表示这里定义的是一个类,其后面是类的名 称,一般首字符用大写字母。在大括号之间可以添加该类的 数据成员和函数成员,整个类定义以分号结束。
访问类的数据成员与访问结构的成员的方法一样,当要 访问对象的某个成员时,只需要在对象名后使用成员访问运 算符“.”和希望访问的成员名。
类的成员函数是那些在类的内部声明或定义函数,它们 作用类的内部成员,可以访问本类内所的成员。 在类内部定义的成员函数称为内联函数,可以使用inline 关键字标识,也可以省略。内联函数的规模一般较小,语句 只有1到5句。对于较大的成中函数而言,直接把代码放在类 定义中使用起来十分不方便。为了避免这种情况,C++允许 在类的外部定义函数,并将函数的原型放在类的内部,表示 该函数是类的成员函数。
在C++中可以为函数中的参数指定默认值,同样也可以为 类的成员函数指定参数的默认值,包括类的构造函数。如果 类的成员函数为内联函数,则可以把参数的默认值放在函数 头中。如果类的成员函数是在外部定义,则参数的默认值只 能放在函数的声明中,而不应该在函数的定义中。
以前,大部分使用显示赋值语句在构造函数中初始化对象 的成员。现在可以使用另一种初始化技术——初始化列表。 下面使用初始化列表对Cube进行初始化: Cube::Cube(double length,double width,double height): m_Length(length),m_Width(width),m_Height()height { cout<<"调用构造函数"<<endl; } 这种方法假设构造函数位于类定义的内部。现在,数据成 员的数值不是在函数内的赋值语句中设定的。因为在声明中 使用功能符号指定了初值,这样可能会比使用赋值语句的效 率高。
C++的内部数据类型只是一些简单的类型,如整数和浮点数。在实际 问题中常会涉及大量的复合数据,这些复合数据就需要我们自定义的数 据结构来描述,最初的自定义数据结构就结构类型。 定义结构 访问结构成员 结构与指针
结构也是将多种数据类型结合在一起的复合数据类型。例如,下面定 义的结构使用三个整型数据表示时间: struct Time { int hour; //0~23 int minute; //0~59 int second; //0~59 }; 关键字struct表明定义的是一个结构,标识符Time是定义的结构名。 在大括号之间声明的变量都是该结构的成员。同一结构内的成员应有惟 一名称,两个不同结构可以包含同名成员而不会冲突。每个结构定义应 该以分号结尾
在定义一个类后,就可以创建该类的一个实例,或对象。 创建类的对象与声明基本类型变量的方法完全相同。例如, 下面的语句创建了Cube类的两个对象: int main() { Cube cube1; Cube cube2; return 0; } 创建的两个Cube类对象它们的结构相同,都有三个数据 成员。但是对象的数据成员都没有包含任何值,因此还需要 访问对象的数据成员,以向其数据成员赋值。
一个类可能在构造函数中分配资源,当创建该类的对象时 就会该对象分配资源。如果不再需要该对象时,应该释放为 其分配的资源。例如,如果构造函数从堆中动态分配了内存, 这块内存在对象消失之前必须被释放,这就是析构函数的作 用。 析构函数也是特殊的类成员函数,它没有返回类型,没有 参数,不能被随意调用,也不能进行重载,当类对象不再有 效时由系统自动调用。类的析构函数与类名相同,只是在类 名前加个否定号“~”。
C++/CLI中的枚举与ANSI C++程序不同。首先,在C++/CLI中定 义一个枚举的语法格式如下: enum class Color{Red,Green,Yellow,Blue,Orange}; 这个语句定义了一个枚举类型Color,Color类型的变量只能被赋 予这个枚举定义的一个值。在访问C++\CLI枚举中的常量时,即终 必须利用枚举类型名称限定正在使用的常量。例如: Color color=Color::Blue; 定义枚举中的关键字class表示枚举常量是对象,而不像ANSI C++枚举中那样仅仅是基本数据类型。实际上,在默认情况下,它 们是Int32类型的对象。 由于C++/CLI枚举是一种类类型,因此不能从局部定义它,如 不能在一个函数内定义它。
对于普通变量,在声明就可以对其进行初始化, 对于数组、指针变量也可以在声明时初始化。那么 在创建类的对象时,如何实现对其初始化呢?这就 需要使用类的构造函数。 构造函数的使用 类的默认构造函数 默认的初始化值 构造函数中的初始化列表
类的构造函数是类的一个特殊成员函数,它在创建类的对 象时被自动调用。因此,可以在构造函数中对类的数据成员 进行赋值,实现在创建类的对象时对各数据成员进行赋值。 C++规定,与类同名的成员函数就是构造函数。例如, Cube类的构造函数必须为Cube()。构造函数没有任何返回类 型,即使写为void也是不允许的。
使用构造函数为类的数据成员赋值的一个目 的就是要确保对象的所有数据成员都被设置为 合适的值。 类的私有成员只能被类的成员函数访问,如 上面的Volume()函数就可以访问私有成员。如 果需要从外部访问类的私有成员,则可以提供 一些公有的函数,在这些公有的函数中提供对 私有成员的访问。这些公有的函数或数据成员 也称为类的接口,因为它们可以提供包括 private成员在内的所有类成员的间接访问。
在实际问题中,有些变量的取值被限定在一个有限的范围 内。例如,一个星期内只有七天,一年只有十二个月等等。 如果把这些量说明为整型,字符型或其它类型显然是不妥当 的。为此,C++提供了一种称为“枚举”的类型。在“枚举” 类型的定义中列举出了所有可能的取值,该“枚举”类型变 量的取值只能是枚举定义的范围。
C++的内部数据类型只是一些简单的类型,如整数和浮点数。在实际问题 中常会涉及大量的复合数据,这些复合数据就需要我们自定义的数据结构来 描述。在本章将讨论如保创建合适的数据类型,以适应具体的问题,以及一 些面向对象的概念,包括什么是对象、类。 结构的使用 联合和枚举 类和对象 类的成员 构造函数 析构函数 类的私有成员 C++/CLI的数值类 C++/CLI的引用类 C++/CLI的类属性
数值类型是一种轻量级的C++/CLI类机制, 非常适合于有限个数据成员的简单对象,且 从语义的角度来看,与数值(Value)类似。
引用类类型在功能上相当于本地C++类。 定义引用类与数值类相似,只是需要使用ref class关键字替换value class关键字。
在C++/CLI中,数值类和引用类都可以有属性。 属性是一种特殊的函数,它可以像某个数据成员 或字段一样通过名称访问,但它实际上则是调用 一个函数。 事实上,类的属性以分为两种:标量属性和索 引属性。下面分别给予介绍。 1.标量属性 . 2.索引属性 .
定义联合的方式与结构类似,只需要使用关键字 union替换struct即可。例如,下面的的定义了一个联 合: union Data { int iVal; double dVal; }; 这个语句定义了一个名为Data的联合类型,它包含 有两个成员,一个为int成员,一个为double型成员。 这个语句很像结构的声明,实际上,它就是一种结构, 只是所有的成员都占用相同的内存内间
C++/CLI有自己的class类型,C++/CLI提供了两种不同特 性的class类型,一种是数值类value class类型,另一种是引 用类ref class类型。数值类类型的对象包含有它自己的数据, 在前文中曾介绍过,像int和double这样的基本数据类型名在 CLR程序中都是数值类类型的简写。而引用类类型在功能上 相当于本地C++类。
在创建类的对象时,会自动调用构造函数。如果没有为类 定义构造函数,是否还会调用构造函数呢?事实上,如果没 有为类定义构造函数,则编译器会提供一个默认的构造函数, 用于创建类的对象。 默认的构造函数没有参数的构造函数。在声明类时,只要 没有为类定义构造函数,则编译器就会自动提供一个默认的 构造函数。可是如果为类提供了构造函数,则编译器就会认 为该构造函数就是默认的构造函数,因此不再提供构造函数。
间接运算符“*”与指针变量一起使用。在 使用变量时,可以直接访问其中存储的数据, 而通过指针变量访问数据时,首先需要获取 指针变量中存储的数据地址,然后再根据该 地址访问数据,这也就是为什么称为间接运 算符。
联合与结构有一些相似之处,但两者有本 质上的不同。结构的各个成员都有各自的内 存空间,一个结构变量的总长度是各成员长 度之和。而在联合中,各成员共享一段内存 空间,一个联合变量的长度等于成员中最长 的长度。