二、实验体会:
实验的思路基本固定,但是具体函数的步骤还需自己来设计,往往想的很好但是确实很难实现,通过上网找一些相似代码能够得到很大启发,从而编出自己的作品,这样也是一种自己提高的过程。
感觉相对其他,类运算的程序相对较容易,因为很多题目都是在书上能够找到例题,只要思路明确就能实现。
下面的截图是我的一个错误,当从txt转帖出来时候,就发现我粘错位了,导致运行时给我下了一跳。以后对于此类事情还是要多多注意。
三、思考题:
1、 请举例或结合实验,说明类的封装特点。
答: 一,安全性 二,面向对象 三,代码的复用 四,程序的简洁性和可读性
2、 明构造函数和析构函数的功能和运行机制。
答:
用构造函数对对象进行初始化,构造函数是一种特殊的成员函数,它主要用于:
(1) 为对象分配空间
(2) 为对象的数据成员进行初始化 (3) 其他指定的任务
在建立对象的时,采用构造函数给数据成员赋初值,通常有以下两种形式。 形式1:
类名 对象名[(实参表)];
这里的“类名”与构造函数名相同,“实参表”是为构造函数提供的实际参数。 #include
Date(int y,int m,int d); //声明构造函数Date的原型 void showDate(); //构造函数的名字必须与类名相同 private:
int year; int month; int day; };
Date::Date(int y,int m,int d) //定义构造函数Date {year=y; month=m; day=d; }
inline void Date::showDate()
{ cout< { Date date1(2010,4,28); date1.showDate(); /*定义类Date的对象date1,调用构造函数, 给对象date1的 return 0; 数据成员赋初值*/ } 在建立对象的时,采用构造函数对对象进行初始化,通常有以下两种形式: 形式1: 例如: Date date1(2010,4,28); 类名 对象名 实参表 形式2: 其一般语法形式为: 例如: Date *pdate = new Date(2010,4,28); 类名 *指针变量名=new 类名(实参表); 指针pdate指向该对象的地址 对象名: 匿名对象,或称对象名是(*pdate) 此时,应使用“->”来访问对象的成员,而不是“.” 析构函数 析构函数也是一种特殊的成员函数。它执行与构造函数相反的操作,通常用于执行一些清理任务,主要有: 1. 释放分配给对象的内存空间。 2. 其他指定的任务 class Student{ //带构造函数的学生类 private: int number; float score; public: Student(int number1,float score1); ~Student( ){ cout<<“destructing”;} //①②③ }; Student :: Student(int number1,float score1) { number=number1; score=score1; } class Student{ private: int number; float score; public: Student(int number1,float score1); ~Student( ){ cout<<“destructing”;} }; Student :: Student(int number1,float score1) { number=number1; score=score1; } ① 析构函数与类名相同,但它前面必须加一个波浪号(~) ② 析构函数没有参数,也没有返回值 ③ 当撤消对象时,编译系统会自动地调用析构函数 3、 请举例或结合实验,说明友元的工作机制。 答:友元函数 友元函数不是当前类的成员函数,但它可以访问该类所有的成员,包括私有成员、保护成员和公有成员。 在类中声明友元函数时,需在其函数名前加上关键字friend。 友元函数既可以是非成员函数,也可以是另一个类的成员函数。 #include Date(int y,int m,int d);//构造函数 friend void showDate(Date&); /*在函数名前加上关键字friend,声明函 数showDate为类Date的友元函数*/ private: int year; int month; int day; }; Date::Date(int y,int m,int d) { year=y;month=m;day=d;}/* 定义友元函数,形参是类Date的对象的引用, 在此函数名前不要加关键字friend, 也不要加“类名::”*/ void showDate(Date& d) { cout< { Date date1(2010,11,14); showDate(date1); return 0;}/*调用友元函数showDate,实参date1是类 Date的对象*/ 说明: (1)友元函数的声明可以放在公有部分,也可以放在保护部分和私有部分。 (2) 友元函数不是成员函数。因此,在类的外部定义友元函数时,不必像成员函数那样,在函数名前加上“类名∷”。 (3) 因为友元函数不是类的成员,所以它不能直接调用对象成员,它必须通过对象(对象指针或对象引用)作为入口参数,来调用该对象的成员。 (4) 一个函数可以是多个类的友元函数。当一个函数需要访问多个类时,友元函数非常有用。 在C++中为什么要引入友元机制呢? (1)声明了一个类的友元函数,就可以用这个函数直接访问该类的私有数据,从而提高了程序运行的效率。 (2)友元提供了不同类的成员函数之间、类的成员函数与一般函数之间进行数据共享的机制。尤其 当一个函数需要访问多个类时,友元函数非常有用。 (3)引入友元机制的另一个原因是方便编程,在某些情况下,如运算符被重载时,需要用到友元函数, 友元函数的不足之处: 破坏了数据的隐蔽性和类的封装性,降低了程序的可维护性,这与面向对象的程序设计思想是背道而驰的。因此使用友元函数应谨慎。 友元类 一个类可以作为另一个类的友元,称为友元类。 友元类的说明方法是在另一个类声明中加入语句: friend 类名; 此语句可以放在公有部分也可以放在私有部分。 例如: class Y { … /*类Y中的所有成员函数都成为类X的友元函数 类Y中的所有成员函数都可以访问类X中的公有和私有成员*/ }; class X { … friend Y; //声明类Y为类X的友元类 … }; 说明: (1) 友元关系是单向的,不具有交换性。 若类X是类Y的友元,类Y是否是X的友元,要看在类中是否有相应的声明。 (2) 友元关系也不具有传递性。 若类X是类Y的友元,类Y是类Z的友元,不一定类X是类Z的友元。

