第三章 - 类和对象

  • 格式:pdf
  • 大小:211.86 KB
  • 文档页数:21

,
private和
它们在类定义中出现的前后顺序及出现的次序没有限制。如果一 个成员函数在类定义中没有进行定义,实现部分将不出现。如果所有 的成员函数在类中进行了详细定义(包括实现细节),则没有实现部 分。用一个类来描述日期,其形式如下: class Date { private: int year; int month; int day; public: void setDate(int y,int m,int d); void showDate(); };
湖南科技大学课程教案 (分页)
授课教 师: 课程名 称 刘毅志 职称: 讲师 单位: 计算机 学院
面向对象技术
授课内容 用计算机解决实际问题时,这些问题由一些相互间存在一定联系 的事物组成。把这些事物称作对象。每个具体的对象都可以用两个特 征来表示:(1)描述事物状态属性所需要使用的数据结构;(2)对 这些数据进行的有限操作,表示事物的动态行为。把数据结构和对数 据的操作放在一起构成一个整体,才能完整地反映实际问题。
public: point(int a=0,int b=0) { x=a;y=b;} void setxy(int a,int b) { x=a;y=b; } void print() { cout << x << " " << y << endl; } }; void main() { int i; point a[6]={point(),point(1,1),point(2,2)}; //初始化 a[3]=point(3,3); a[4]=point(4,4); a[5]=point(); //赋值 a[5].setxy(5,5); for(i=0;i<6;i++) a[i].print(); }
二、成员函数的声明
通常采用以下两种方式:(1)在类外以普通函数的形式定义; (2)在类内以内联函数的形式隐式声明。 在类外,将成员函数以普通函数的形式定义。 返回类型 类名∷成员函数名(参数表) { // 函数体 } 例如:以下是表示坐标点的类Coord的声明。 class Coord { private: int x,y; public: void setCoord (int,int); // 设置坐标点 int getx(); // 取x坐标点 int gety(); // 取y坐标点
自定义拷贝构造函数的一般形式如下: 类名::类名(类名& 对象名) { // 拷贝构造函数的函数体 } 如果没有编写自定义的拷贝构造函数,C++会自动地将一个已存 在的对象复制给新对象,这种按成员逐一复制的过程由是缺省的拷贝 构造函数自动完成的。 例3.20 调用缺省的拷贝构造函数。 #include<iostream.h> class Coord{ public: Coord(int a,int b) { x=a; y=b; cout<<"Using normal constructor\n"; } void print() { cout<<x<<" "<<y<<endl;} private: int x,y; }; int main() { Coord p1(30,40); // 定义类Coord的对象p1, // 调用了普通构造函数初始化对象p1 Coord p2(p1); // 以“代入”法调用缺省的 //拷贝构造函数, 用对象p1初始化对象p2 Coord p3=p1; // 以“赋值”法调用缺省的 //拷贝构造函数, 用对象p1初始化对象p3 p1.print(); p2.print(); p3.print(); return 0; }
6.类的作用域
类的作用域是指在类声明中的一对花括号所形成的作用域。一个 类的所有成员都在该类的作用域内。一个类的任何成员可以访问该类 的其他成员。类外对该类的数据成员和成员函数的访问则要受到一定 的限制,有时甚至是不允许的。这体现了类的封装特性。
四、构造函数与析构函数
构造函数和析构函数都是类的成员函数。但它们都是特殊的成员 函数,执行特殊的功能;不用调用便自动执行;这些函数的名字与类 的名字有关。
1.构造函数
构造函数:主要用于为对象分配空间和初始化。函数名必须与类 名相同;可以有任意类型的参数,但不能指定返回类型;它有隐含的 返回值,该值由系统内部使用;函数体可写在类内或类外;可重载, 即:一个类中可以定义多个参数个数或参数类型不同的构造函数。 构造函数被声明为公有函数,但它不能象其他成员函数那样被显 式地调用。它是在创建对象的同时被调用的。 通常,利用构造函数创建对象有以下二种方法: (1)利用构造函数直接创建对象。其一般形式为: 类名 对象名[(实参表)]; 这里的“类名”与构造函数名相同,“实参表”是为构造函数提供
3.对象中成员的访问
在类外,通过类的对象进行访问的一般形式: (1)对象名.数据成员名 (2)对象名.成员函数名(参数表) (3)对象名.类名::成员函数名(参数表) 其中:“.”叫做对象选择符,简称点运算符,也叫成员引用运算 符。
4.类成员的访问属性
(1)公有(public)成员:可以被类中成员函数访问;类外,还 可通过类的对象进行访问。 (2)私有(private)成员:只能被类中成员函数访问;类外, 不能通过类的对象进行访问。 (3)保护(protected)成员:除了类本身的成员函数可以访问 外,该类的派生类的成员也可以访问;但不能在类外通过类的对象进 行访问。
湖南科技大学课程教案 (章节、专题首页)
授课教 师: 刘毅志 职称: 讲师 单位: 计算机 学院
课程名 面向对象技术 称 章节、 第三章 类和对象 专题 教学 1) 类与对象的基本概念; 目标 2) 对象数组; 及基 3) 对象指针; 本要 4) 向函数传递对象。 求 1) 类与对象的定义; 2) 构造函数与析构函数; 3) 对象数组与对象指针; 教学 4) 字符串类; 重点 5) 对象的赋值和复制; 6) 静态成员; 7) 友元; 8) 常类型。 教学 1) 对象数组与对象指针; 难点 2) 友元和类的组合。 教学 教学内容占四个课时,习题讲解占两个课时,上机实验占两 内容 个课时。习题内容如下: 与时 1) 习题解答与上机指导中第3、4章的所有习题; 间分 2) 参考第8章的程序实例。 配
5.对象赋值语句
例3.5 用对象赋值语句的例子。 #include<iostream.h> class abc { public: void init(int i,int j) { a=i; b=j; } void show(){ cout<<a<<" "<<b<<endl; }
private: int a,b; }; main() { abc o1,o2; o1.init(12,34); o2=o1; // 将对象o1数据成员的值赋给对象o2 o1.show(); o2.show(); system(“pause”); }
3.析构函数
析构函数:通常用于撤消对象时的一些清理任务,如释放分配给 对象的内存空间等。它执行与构造函数相反的操作,也是一种特殊的 成员函数。 析构函数具有一些特殊的性质: (1)在构造函数名字前,加一个波浪号(~); (2)没有参数,也没有返回值,而且不能重载; (3)在一个类中只能有一个析构函数; (4)撤消对象时,编译系统自动调用析构函数。
2.类声明的一般格式
class 类名 { [private:] <私有数据成员声明>; <私有成员函数声明>; protected: <保护数据成员声明>; <保护成员函数声明>; public: <公有数据成员声明>; <公有成员函数声明>;
}; <各个成员函数的定义>
3.访问控制修饰符(public protected)
五、自引用指针
例4.1 自引用指针this应用举例。 #include<iostream.h> class A{ 1; } void disp() {cout<<"x= "<< x << endl;} //相当 于this->x }; void main() { A a(1),b(2); cout<<" a: "; a.disp(); cout<<" b: "; b.disp(); }
三、对象的定义和使用
1.类与对象的关系
类是具有共同属性和行为的事物所构成的集合。在C++中,把相 同数据结构和相同操作集合的对象看成属于同一类 。
2.对象的定义
对象的定义有两种方式:(1)在声明类的同时直接定义对象。 即,在类的右花括号“}”后,直接写出对象名表。(2)声明类之后, 在使用时再定义对象。
的实际参数。 (2)通过指针和new来实现。其一般形式为: 类名 *指针变量 = new 类名[(实参表)]; 例如: Date *date1=new Date(2007,4,9); 就创建了对象(*date1)。
2.成员初始化表
带有成员初始化表的构造函数的一般形式如下: 类名::构造函数名([参数表])[:成员初始化表] { // 构造函数体 } 成员初始化表的一般形式为: 数据成员名1(初始值1),数据成员名2(初始值2),……
4.拷贝构造函数
拷贝构造函数是一种特殊的构造函数。其形参是本类对象的引 用。其作用是使用一个已经存在的对象去初始化另一个同类的对象。 拷贝构造函数的特点:(1)因为该函数也是一种构造函数,所 以其函数名与类名相同,并且该函数也没有返回值类型。(2)该函 数只有一个参数,并且是同类对象的引用。(3)每个类都必须有一 个拷贝构造函数。程序员可以根据需要定义特定的拷贝构造函数,以 实现同类对象之间数据成员的传递。如果程序员没有定义类的拷贝构 造函数,系统就会自动生成产生一个缺省的拷贝构造函数。