C++课上ppt2 类和数据抽象

来源:互联网 发布:mysql连接池配置文件 编辑:程序博客网 时间:2024/06/11 20:49
一种ADT应具有
1   说明部分(说明该该ADT是什么及如何使用):说明部分描述数据值的特性和作用于这些数据之上的操作。ADT的用户仅须明白这些说明,而无须知晓其内部实现。 

2   实现部分。

Class: is a user-defined data type that represents an ADT in C++ that haveattributes (data members) and behaviors (member functions) that operate on the data members.
Variables of the class type are called class objects(对象) or class instances(实例).
Software that uses the class is called a client(客户代码).Client code uses public member functions to handle its class objects.

class DATE   // DATE.h----Specification file of class DATE{     public:void Set( int, int, int );int getMonth() const;int getDay() const;int getYear() const;void Print() const;void Increment();void Decrement();    private:            int month;            int day;            int year;};

class是保留字,说明DATE是类名。在{}中列出类的成员。
类的成员包括:
数据成员:一般说来,数据成员是需要隐藏的对象即外部的程序是不能直接访问这些数据的,应该通过函数成员来访问这些数据。所以一般情况下,数据成员通过关键字private声明为私有成员(private member)
函数成员:通过关键字public声明为公有成员(public member)。外部程序可以访问共有成员,但无法访问私有成员。
对于类的使用者(即用户代码,简称用户)而言,只需要获得DATE.h,即可调用类对象的公有函数访问其内部的数据成员。使用者无法直接访问私有成员,也无需知晓公有函数的内部实现。


在DATE.cpp文件开头需要加入预处理命令
                                #include “DATE.h”
这是因为在DATE.cpp中要用到用户自定义的标识符DATE,而它的定义在DATE.h中。

在DATE.h中,各函数原型是在{}中的。根据标识符的作用域规则,它们的作用范围仅在类定义中,而不包括DATE.cpp。因此在DATE.cpp中需要利用作用域解释运算符“::”来指明这里的函数是类DATE里的成员函数。
DATE.cpp中有时还包括DATE内部要使用到的函数,例如DaysInMonth。这种函数并非对外公开供用户使用,因此可以将其声明为类的私有成员。若在该函数中没有涉及该类的数据成员,则无需将它们声明为类的成员。


年、月、日这些内部数据被隐藏在模块中(这里的模块是文件DATE.cpp),客户程序只能通过该模块提供的公开操作来访问这些数据,而不能直接访问这些数据。
这种保护措施称为信息隐藏(Information Hiding)

把这这些数据与相关操作组织在一起的方式称为封装(Encapsulation)。


客户程序:只关心DATE能够提供那些公开的操作(即提供了哪些函数可调用),并不关心这些操作的具体实现。也就是说,用户只关心DATE能“做什么”,而不关心它内部“如何做”。
封装就是实现ADT的策略,而信息隐藏则是ADT的特点。
信息隐藏和封装是软件开发的必要技术,亦具商业价值。


成员函数是公用的。


Class Constructors (构造函数)

A class constructor is a member function whose purpose is to initialize the private data members of a class object.

The name of a constructor is always the name of the class, and there is no return type for the constructor.

A class may have several constructors with different parameter lists.  A constructor with no parameters is the default constructor.
A constructor is implicitly invoked when a class object is declared.


若声明类对象时没有实参列表,则:
(1) 若该类有缺省构造函数(即无参构造函数) ,则调用该构造函数,同时创建该对象(为该对象分配内存空间) 。
(2) 若该类没有缺省构造函数,则创建该对象。但该对象的私有成员没有得到初始化。


如果设计的类没有构造函数,C++编译器会自动为该类型建立一个缺省构造函数。该构造函数没有任何形参,且函数体为空。
应该养成编写构造函数的习惯。

初始化的一种方法:

class DATE                                                                                                         // DATE.h{    public:         DATE( int = 2000, int = 1, int = 1 );                                        :};


使用new和delete动态分配和释放内存空间

int *p;p = new int[ Length ];delete []p;


指针=new 类型名;//动态创建一个变量
指针=new 类型名[数组长度];//用于动态分配数组
指针=new 类型名(初始化表);//动态创建对象
new运算返回一个指针,指向分配到的内存空间
若内存分配失败,则返回NULL(0)。

**动态分配的内存空间使用完毕后,应该“释放”掉这块空间,即使得这块内存空间可以被操作系统回收以作它用。
假如程序中动态分配了很多内存空间,但使用完毕后都不释放,则这些空间无法用于存储别的数据,造成严重的内存浪费



Destructor (析构函数)
也是类的成员函数。作用是在对象撤销时执行一些清理任务。
C++语言规定析构函数名是类名前加波浪号“~”,以别于构造函数。
析构函数不能有任何返回类型,这点与构造函数相同。但同时析构函数还不能带任何参数,也就是说析构函数一定是无参函数。
在客户代码中,可以通过“.”显式调用析构函数;但更多的情况下,是在对象生存期结束时自动被调用的。


date_ptr = new DATE[k];delete [ ]date_ptr;  //[ ]将令所有元素都调用各自的析构函数


delete

用new分配的内存在不再使用时,要用delete释放。
delete释放的是指针所指对象占据的内存。
用delete释放空间后,指针的值仍是原来指向的地址,但指针已无效(重复释放将出错)

delete对象指针,会调用该对象的析构函数。
若使用new运算分配的是数组(尤其是类类型对象的数组),则用delete释放时必须注意加上方括号。
注意:由于delete一个指针即等同于释放掉该指针所指向的内存空间,而在C++中同一内存空间的释放只能进行一次;已delete过的指针再次delete会产生错误。因此,最好不要让多个指针指向同一个对象(多个指针同时指向同一内存空间的现象称为“指针别名”)
注意2:程序不再需要动态创建的对象时,一定要记住释放掉这些对象。否则这些空间会一直被占用,无法分配给别程序使用;如果指向这些空间的指针指向了别处,将无法回收这些内存空间。
这些无法回收的内存空间称为内存垃圾(garbage)。内存垃圾不断增加会消耗掉大量内存空间,有时会导致系统崩溃。


浅复制和深复制
深复制在浅复制的基础上,连同指针指向的对象也一起复制,代价比较高,但是相对容易管理。


Separate Compilation and Linking of Files
.cpp被编译成.obj文件,同一程序中的各个obj文件被链接成.exe可执行文件。.h文件是不会被编译的。
在C++中,多文件程序中的各.cpp文件不但被单独编译(separate compilation) ,而且可以在不同的时刻编译。
对于一个类,例如DATE,其.h及.obj文件都应该可以被用户使用。前者使用户知晓对象的功能和如何使用该对象;用户也需要后者链接到他自己的程序上,以便创建可执行文件。


const Member Functions
Data members can not be modified in a const member functions.
‘const’ appears in both function prototype and function definition.
‘const’ is used for readability and credibility.


const Member Data
常量数据成员的声明与符号常量(命名常量)的声明类似。
常量数据成员是对象的数据成员,不能在声明时初始化,且常量一旦声明之后就不能再作为左值,所以只能在构造函数的初始化列表中对常量数据成员进行初始化。


class Demo {public:Demo( ): data1(0) // 常量数据成员只能在构造函数初始化列表中初始化{       // data1 = 0;// 此处不能对常量数据成员data1赋值                  data = 0;}private:      int data;// 一般的数据成员      const int data1;// 常量数据成员};



类的静态成员
静态(static)成员是类的组成部分但不是任何对象的组成部分
通过在成员声明前加上保留字static将成员设为static(在数据成员的类型前加保留字static声明静态数据成员;在成员函数的返回类型前加保留字static声明静态成员函数
static成员遵循正常的公有/私有访问规则。 C++程序中,如果访问控制允许的话,可在类作用域外直接(不通过对象)访问静态成员(需加上类名和::)
静态数据成员具有静态生存期,是类的所有对象共享的存储空间,是整个类的所有对象的属性,而不是某个对象的属性。
与非静态数据成员不同,静态数据成员不是通过构造函数进行初始化,而是必须在类定义体的外部再定义一次,且恰好一次,通常是在类的实现文件中再声明一次,而且此时不能再用static修饰。
静态成员函数不属于任何对象 
静态成员函数没有this指针
静态成员函数不能直接访问类的非静态数据成员,只能直接访问类的静态数据成员



class DATE           // DATE.h{    public:         DATE( int =2000, int =1, int = 1);                                 static void getCount( ); private:            int month;            int day;            int year;            static int count;};




this指针的使用
return *this;



拷贝构造函数
Three kinds of constructor:
1、default constructor:constructor with no parameters.
2、normal constructor:data members are initialized by the parameters.
3、copy constructor(拷贝构造函数):the object being created is initialized by an existing object.
形参类型为该类类型本身且参数传递方式为按引用传递。
用一个已存在的该类对象初始化新创建的对象。
每个类都必须有拷贝构造函数:
用户可根据自己的需要显式定义拷贝构造函数。
若用户未提供,则该类使用由系统提供的缺省拷贝构造函数。
缺省拷贝构造函数使用逐位复制方式利用已存在的对象来初始化新创建的对象(相当于赋值=)
用类类型本身作形式参数。
该参数传递方式为按引用传递,避免在函数调用过程中生成形参副本。
该形参一般声明为const,以确保在拷贝构造函数中不修改实参的值
                             C::C(const  C& obj);
对于不含指针成员的类,使用系统提供(编译器合成)的缺省拷贝构造函数即可。
缺省拷贝构造函数使用浅复制策略,因此对含指针成员的类并不能满足需要。
含指针成员的类通常应在构造函数(及拷贝构造函数)中分配内存,在析构函数中释放内存。


Composition(组合)


 #include "date.h class Employee{public:      Employee( char *, char *, int, int, int, int, int, int );private:      Date hireDate;  };  Employee::Employee( char *fname, char *lname,                     //Empoyee.cpp                      int bmonth, int bday, int byear,                       int hmonth, int hday, int hyear )                           : hireDate( hmonth, hday, hyear ), birthDate( bmonth, bday, byear ){......}

对象成员:在类中声明的具有类类型的数据成员
为了初始化对象成员,类的构造函数必须调用对象成员所属类的构造函数

0 0
原创粉丝点击