南京邮电大学面向对象程序设计及C++实验1: 类和对象的定义及使用

实验目的和要求
(1)掌握类与对象的定义与使用方法,理解面向对象方法中通过对象间传递消息的工作机制。
(2)正确掌握类的不同属性成员的使用方法。
(3)掌握构造函数与析构函数的概念,理解构造函数与析构函数的执行过程。
(4)掌握友元函数和友元类的定义和使用。
(5)基本掌握指针和引用作为函数参数的应用。

实验题目1 定义一个借书证类BookCard,在该类定义中包括如下内容。
(1)私有数据成员:
string id;          //借书证学生的学号
string stuName;    //借书证学生的姓名
int number;       //所借书的数量
(2)公有成员函数:
构造函数       //用来初始化3 个数据成员,是否带默认参数值参考结果来分析
void display()   //显示借书证的3 个数据成员的信息
bool borrow()   //已借书数量不足10 则将数量加1,数量达到10 则直接返回false
主函数及f()函数代码如下。请结合输出结果完成程序。(学长这里就不给了)


#include <string>
#include <iostream>
using namespace std;
class BookCard
{
   private:
	   string id;
	   string stuName;
	   int number;
   public:
	   BookCard(string n = "B20190620", string stu = "雪峰", int num = 4);
	   void display();
	   bool borrow();
};

BookCard::BookCard(string n, string stu, int num):id(n),stuName(stu),number(num){}

void f(BookCard& bk)
{
	if (!bk.borrow())
	{
		bk.display();
		cout << "you have borrowed 10 books,can not borrow anymore!" << endl;
	}
	else
		bk.display();
}

int main()
{
	BookCard bk1("B20190620", "东平", 10), bk2;
	f(bk1);
	f(bk2);
	return 0;
}


void BookCard::display()
{
	cout << id << " " << stuName << " " << number << endl;
}

bool BookCard::borrow()
{
	if (number == 10)
		return 0;
	if (number >= 0 && number < 10)
		return 1;
}

实验题目2 定义一个时间类Time,有三个私有成员变量Hour、Minute、Second,定义构造函数、析构函数以及用于改变、获取、输出时间信息的公有函数,主函数中定义时间对象,并通过调用各种成员函数完成时间的设定、改变、获取、输出等功能。

① 按要求完成类的定义与实现。

② 修改数据成员的访问方式,观察编译结果。

③ 在Time类中定义一个成员函数,用于实现时间增加一秒的功能,主函数中通过对象调用该函数,并输出增加一秒后的时间信息。

④ 定义一个普通函数。

void f(Time  t)

{    t. PrintTime( );

}

在Time类中增加拷贝构造函数的定义,主函数中调用该函数,运用调试工具跟踪,分析整个程序调用构造函数(包括拷贝构造函数)和析构函数的次数;再将f函数的形式参数分别修改为引用参数和指针参数(此时函数代码修改为{t-> PrintTime( );},主函数中调用,再分析此时调用构造函数和析构函数的次数。

class Time
{
   private:
	   int Hour;
	   int Minute;
	   int Second;
   public:
	   Time(int h = 0,int m = 0,int n = 0);
	   Time(const Time& obj);
	   ~Time();
	   void ChangeTime(int h = 0, int m = 0, int n = 0);
	   int GetHour();
	   int GetMinute();
	   int GetSecond();
	   void PrintTime();
	   void IncreaseOnesecond();
};

void f(Time t);

Time::Time(int h, int m, int n)
{
	//cout<<"Constructing..."<<endl;
	Hour = h;
	Minute = m;
	Second = n;
}

void Time::ChangeTime(int h, int m, int n)
{
	Hour = h;
	Minute = m;
	Second = n;
}

Time::Time(const Time& ob)
{
	//cout<<"Copy constructing..."<<endl;
}

Time::~Time()
{
	//cout<<"Destructing..."<<endl;

}

int Time::GetHour()
{
	return Hour;
}

int Time::GetMinute()
{
	return Minute;
}

int Time::GetSecond()
{
	return Second;
}

void Time::PrintTime()
{
	cout << Hour << " " << Minute << " " << Second << endl;
}

//void Time::IncreaseOnesecond()
{
	Second++;
}

void f(Time t)
{
	t.PrintTime();
	cout << "call f\n";
}

int main()
{
	Time t1;
	Time t2(1);
	Time t3(1, 2);
	Time t4(1, 2, 3);
	t1.PrintTime();
	t2.PrintTime();
	t3.PrintTime();
	t4.PrintTime();
	t1.ChangeTime(4, 5, 6);
	t2.ChangeTime(4, 5, 6);
	t3.ChangeTime(4, 5, 6);
	t4.ChangeTime(4, 5, 6);
	t1.PrintTime();
	t2.PrintTime();
	t3.PrintTime();
	t4.PrintTime();
	return 0;
}

程序的运行结果是:
0 0 0
1 0 0
1 2 0
1 2 3
4 5 6
4 5 6
4 5 6

构造函数与析构函数的调用方式及执行顺序是:
构造函数和析构函数的调用方式都是自动调用
构造函数在创建变量时自动执行,析构函数在程序结束后自动执行

③取消类中成员函数IncreaceOneSecond( )的注释标志,将该函数补充完整,注意时间在增加一秒情况下的进位关系。

void Time::IncreaseOnesecond()
{
	if (Second == 59)
	{
		Second = 0;
		if (Minute == 59)
		{
			Minute = 0;
			if (Hour == 23)
			{
				Hour == 0;
			}
			Hour++;
		}
		else
			Minute++;
	}
	if (Second >= 0 && Second < 59)
		Second++;
}

实验题目3 定义一个Girl类和一个Boy类,这两个类中都有表示姓名、年龄的私有成员变量,都要定义构造函数、析构函数、输出成员变量信息的公有成员函数。
①根据要求定义相应的类。
②将Girl类作为Boy类的友元类,在Girl类的成员函数VisitBoy(Boy & )中访问Boy类的私有成员,观察程序运行结果。
③在Boy类的某成员函数VisitGirl(Girl & )中试图访问Girl类的私有成员,观察编译器给出的错误信息,理解原因。
④主函数中正确定义两个类的对象,调用各自的成员函数实现相应功能。
⑤再将Boy类作为Girl类的友元类,在Boy类的某成员函数VisitGirl(Girl & )中访问Girl类的私有成员,观察编译器给出的信息。
⑥删除两个类中的函数VisitGirl(Girl & ) ,VisitBoy(Boy & ),定义一个顶层函数VisitBoyGirl(Boy &, Girl &),作为以上两个类的友元,通过调用该函数输出男孩和女孩的信息。

#include <iostream>
using namespace std;
class Boy;
class Girl
{
private:
	string name;
	int age;
	friend Boy;
public:
	Girl(string N, int A);
	~Girl()
	{
		cout << "Girl destructing...\n";
	}
	void Print();
	void VisitBoy(Boy&);
};

class Boy
{
	string name;
	int age;
	friend Girl ;
public:
	Boy(string N, int A);
	~Boy()
	{
		cout << "Boy destructing...\n";
	}
	void Print();
	void VisitGirl(Girl&);
};

Girl::Girl(string N, int A)
{
	name = N;
	age = A;
	cout << "Girl costructing...\n";
}

void Girl::Print()
{
	cout << "Girl's name: " << name << endl;
	cout << "Girl's age: " << age << endl;
}

void Girl::VisitBoy(Boy& boy)
{
	cout << "Boy's name: " << boy.name << endl;
	cout << "Boy's age: " << boy.age << endl;
}

Boy::Boy(string N, int A)
{
	name = N;
	age = A;
	cout << "Girl costructing...\n";
}

void Boy::Print()
{
	cout << "Girl's name: " << name << endl;
	cout << "Girl's age: " << age << endl;
}

void Boy::VisitGirl(Girl& girl)
{
	cout << "Boy's name: " << girl.name << endl;
	cout << "Boy's age: " << girl.age << endl;
}

int main()
{
	Boy boy1("张三", 15);
	Girl girl1("李四",16);
	boy1.Print();
	girl1.Print();
	boy1.VisitGirl(girl1);
	girl1.VisitBoy(boy1);
}

运行结果学长这里就不放了。

②将Girl类作为Boy类的友元类, 写出Girl类的成员函数VisitBoy(Boy & )的实现代码。

void Girl::VisitBoy(Boy& boy)
{
	cout << "Boy's name: " << boy.name << endl;
	cout << "Boy's age: " << boy.age << endl;
}

③在Boy类的某成员函数VisitGirl(Girl & )中试图访问Girl类的私有成员,记录编译器给出的错误信息,与②对比,你能得出友元的什么特性?

友元可以访问别的类的私有成员变量。

④在上面代码的基础上,在Girl类的定义中,增加一行代码:friend  Boy; 在主函数中通过Boy类对象. VisitGirl(Girl类对象) 的形式输出Girl类对象的信息。编译的结果是什么?写出这一步你的主函数代码,要求分别用友元函数Girl类对象. VisitBoy(Boy类对象);和Boy类对象. VisitGirl(Girl类对象) ;和输出两个类对象的信息。

int main()
{
	Boy boy1("张三", 15);
	Girl girl1("李四",16);
	boy1.Print();
	girl1.Print();
	boy1.VisitGirl(girl1);
	girl1.VisitBoy(boy1);
}

⑤定义一个顶层函数void VisitBoyGirl(Boy &, Girl &),作为以上两个类的友元函数,主函数中通过调用该函数输出男孩和女孩的信息。写出该友元函数的完整代码,以及主函数的代码。

void VisitBoyGirl(Boy& boy, Girl&girl)
{
	cout << "Girl's name: " << girl.name << endl;
	cout << "Girl's age: " << girl.age << endl;
	cout << "Boy's name: " << boy.name << endl;
	cout << "Boy's age: " << boy.age << endl;
}

实验小结学长就不放了~大家对照代码查漏补缺,不会的知识点可以google~

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,以下是我提供的代码: ```c++ #include <iostream> #include <string> using namespace std; class Employee { protected: string name; int age; public: Employee(string name, int age) { this->name = name; this->age = age; } virtual void display() { cout << "Name: " << name << endl; cout << "Age: " << age << endl; } }; class Manager : public Employee { private: int department; public: Manager(string name, int age, int department) : Employee(name, age) { this->department = department; } void display() { cout << "Name: " << name << endl; cout << "Age: " << age << endl; cout << "Department: " << department << endl; } }; class Salesman : public Employee { private: int sales; public: Salesman(string name, int age, int sales) : Employee(name, age) { this->sales = sales; } void display() { cout << "Name: " << name << endl; cout << "Age: " << age << endl; cout << "Sales: " << sales << endl; } }; class SalesManager : public Manager, public Salesman { public: SalesManager(string name, int age, int department, int sales) : Manager(name, age, department), Salesman(name, age, sales) {} void display() { cout << "Name: " << name << endl; cout << "Age: " << age << endl; cout << "Department: " << department << endl; cout << "Sales: " << sales << endl; } }; int main() { Employee* e = new Employee("Tom", 25); e->display(); cout << endl; Manager* m = new Manager("Jerry", 30, 101); m->display(); cout << endl; Salesman* s = new Salesman("Lucy", 28, 100000); s->display(); cout << endl; SalesManager* sm = new SalesManager("Bob", 35, 102, 200000); sm->display(); cout << endl; return 0; } ``` 解释一下:我们定义了一个 `Employee` 类,表示员工,包含姓名和年龄两个属性,以及一个 `display()` 方法用于显示员工信息。然后派生出 `Manager` 类和 `Salesman` 类,分别表示经理和销售员,这两个类在 `Employee` 类的基础上增加了一些属性,分别为部门和销售额,同时也重载了 `display()` 方法。最后,我们再派生出 `SalesManager` 类,表示销售经理,这个类同时继承了 `Manager` 和 `Salesman` 两个类,因此可以直接使用它们的属性和方法。在 `main()` 函数中,我们分别创建了一个 `Employee` 对象、一个 `Manager` 对象、一个 `Salesman` 对象和一个 `SalesManager` 对象,然后都调用了它们的 `display()` 方法来展示各自的信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值