学习C++(五)

本文介绍了C++的面向对象程序设计,强调了抽象和分类的重要性。抽象通过数据和代码来描述对象的共性,而分类则通过类的层级结构实现具体化。面向对象设计在大多数情况下能产生更有效且易于维护的程序。文章通过侠客、上课、点菜和买鞋的例子,深入浅出地阐述了面向对象的概念和优势。
摘要由CSDN通过智能技术生成

目录

面向对象程序设计

抽象

分类

设计和效率

侠客例子

上课例子

点菜例子

买鞋例子


面向对象程序设计

  C++区别于C的特征是C++支持面向对象程序设计。

  面向对象程序设计基于两个原则:抽象和分类。

    1.抽象 抽象与具体相对应。一个人名是抽象,它代表某人的一切属性,包括身高,体重,文化程度等。抽象是具体事物的描述的一个概括。 现实生活中,为了减少必须处理的事情,我们是在某一程度的细节中生活的。在面向对象的计算机世界中,这种细节程度就叫抽象 

    2.分类 层层分类,使概念逐渐细化,即具体化。相反,归类的结果,便是逐步抽象的过程。  

抽象

  抽象是对具体对象(问题)进行概括,抽出这一类对象的公共性质并加以描述的过程。

    1.数据抽象:描述某类对象的属性或状态(对象相互区别的物理量)

    2.代码抽象:描述某类对象的共有的行为特征或具有的功能。

    3.抽象的实现:通过类的声明。

  比如使用微波炉的步骤是,先打开门,把制作的原料放进去,然后关好门并按微波炉前面控制板上的有关按钮,它就开始工作了 使用微波炉,人们处于下面的状态: (1)不用重新设计布局, 不用改变微波炉的内部结构即可使它工作。人们使用微波炉,只需跟微波炉的面板打交道。微波炉有一个接口,就是微波炉的面板,板上有所有的控制按钮和时间显示。微波炉的所有功能都是通过面板控制获得的 (2)不用重新编制软件来驱动和控制微波炉中的微处理器, 即与上次使用微波炉的目的无关 (3)不用了解微波炉的内部结构。 (4)一个微波炉的设计师,知道微波炉的内部是用于烧菜热菜, 而无须考虑其工作原理。   

分类

  层层分类,使概念逐渐细化,即具体化。类是层层分解的,这些类与子类的关系可以被规格化地描述。描述了类,再描述其子类,就可以只描述其增加的部分。

  类的层次通常反映了客观世界中某种真实的模型。在这种情况下,不难看出:基类是对若干个子类的抽象,而子类是基类的具体化。基类抽取了它的子类的公共特征,而子类通过增加行为将抽象类变为某种有用的类型。

  这在面向对象程序设计中是分工明确的两种编程:

    一种是面向对象应用程序设计

    一种是类库设计。

  他们都属于面向对象程序设计范畴  例如,广告上说,某某牙膏具有特殊的止血功能。我们便知道,该产品是一种牙膏,具有牙膏的一切属性,外壳形状,颜色,膏状,清洁牙齿的功能,用在牙刷上等。除此之外,它还具有止血的特殊疗效。所以,牙膏是抽象的概念,它使我们理解一切具有牙膏属性的东西。任何牙膏的新产品,只要描述一下除了牙膏公共属性之外的特殊属性即可。

设计和效率

  对于大部分问题来说,面向对象设计比结构化设计能够产生出更加有效的程序。

  面向对象编程有可读性好,容易维护等优点

  一些小程序,可以通过过程化的程序设计技巧和优化,小幅度提高运行速度,但往往以牺牲可读性为代价,给维护造成大量的困难。一旦程序规模扩大,程序的可读性和可维护性,甚至连结构化的程序设计都感到力不从心。 在现实生活中,能解决问题的小规模程序是很少的。所以,可以说,面向对象程序设计比结构化程序能够产生出更加有效的程序。而且,面向对象的程序,其可读性、可维护性都比结构化程序好。   

  面向对象程序设计可以将程序员分成两类:

    一类是面向对象应用程序设计。所谓面向对象程序设计,多是指此。他(她)们无须了解类的实现细节,就像使用微波炉那样,这要比结构化程序设计简单得多。

    一类是类库设计。他(她)们为面向对象程序设计提供“素材”。这些素材涉及各个领域,由各领域的专业人员来设计完成。他(她)们需要了解特定类的知识。由于知识以类为单位,类是规范格式的,所以每个类的描述也很轻松,并使程序设计的分工合作更易于进行。因此,只要将问题归结为对象以及对象的联系,便可得到问题的解答。这样的程序可读性是良好的,可维护性也是良好的, 因为程序的结构更加规范化,它以抽象层来划分问题的解,而且问题的描述几乎就是程序的实现。  

侠客例子

#include <iostream>
using namespace std;

/**
* 侠客类
**/
class Swordsman
{
	string m_name;		// 姓名
	bool m_state;			// 身体状况
public:
	Swordsman(string name,bool state = true):m_name(name),m_state(state){}
	~Swordsman(){}

	void attack(Swordsman &s);// 1.偷袭
	void check(Swordsman &s);	// 2.诊断
};

// 1.偷袭
void Swordsman::attack(Swordsman &s)
{
	cout << m_name << "  偷袭了 " 
			<< s.m_name << endl;

	s.m_state = false;
	return ;
}

// 2.诊断
void Swordsman::check(Swordsman &s)
{
	cout << "经 "   << m_name << " 诊断  " 
			<< s.m_name << (s.m_state?"无大碍":"受伤了 ") << endl;
	return ;
}

int main(int argc,char **argv)
{
	Swordsman s1("张无忌");
	Swordsman s2("令狐冲");
	Swordsman s3("平一指");

	s1.attack(s2);
	s3.check(s2);

	return 0;
}

上课例子

#include <iostream>
using namespace std;

/**
* 教师类
**/
class Teacher
{
	string m_name;		// 姓名
	string m_course;		// 课程
	string m_addr;		// 地点
public:
	// 参数列表的顺序 和  初始化列表顺序没关系
	//	            只和  参数传递的顺序有关系
	Teacher(string name,string addr,string course):
		m_name(name),
		m_course(course),
		m_addr(addr){}
	~Teacher(){}

	string getCourse(){ return m_course;}
	string getAddr(){ return m_addr;}

	void teach();
};

void Teacher::teach()
{
	cout << m_name << "  在 "
			<< m_addr << " 教 "
			<< m_course << " 课程" << endl;
	return ;
}

/**
* 学生类
**/
class Student
{
	string m_name;		// 姓名
public:
	Student(string name):m_name(name){}
	~Student(){}

	void listen(string szTime,Teacher &);
};

void Student::listen(string szTime,Teacher &t)
{
	//小甜甜 上午 在 项目一组 上 C++课程
	cout << m_name << " "
			<< szTime <<  "  在 "
			<< t.getAddr() << " 上 "
			<<  t.getCourse() << " 课程" << endl;
	return ;
}

int main(int argc,char **argv)
{
	Teacher t1("马老师","项目一组","C++");
	Teacher t2("江老师","项目四组","Arm");
	Student s("小天天");

	t1.teach();
	t2.teach();
	
	s.listen("上午",t1);
	s.listen("下午",t2);

	return 0;
}

点菜例子

#include  <iostream>
using namespace std;

/**
* 服务员类
**/
class Waiter
{
	string m_name;	// 姓名
public:
	Waiter(string name):m_name(name){}
	~Waiter(){}

	string getName(){ return m_name;}
	
	//1.上菜
	void serve(int iCount,string szFood);
};

//1.上菜
void Waiter::serve(int iCount,string szFood)
{
	cout << m_name << " 上了 " 
			<< iCount << " 份 " << szFood << endl;
	return ;
}

/**
* 客户类
**/
class Guest
{
	string m_name;	// 姓名
public:
	Guest(string name):m_name(name){}
	~Guest(){}
	
	//1.点菜
	void order(Waiter &w);
	// 2.付款
	void pay(Waiter &w);
};

//1.点菜
void Guest::order(Waiter &w)
{
	cout << "*********点菜过程*********" << endl;
	int iCount = 0;		// 菜的份数
	string szFood;			// 菜的名称

	cout << "请输入菜名:";
	cin >>szFood;

	cout << "请输入菜的份数:";
	cin >>iCount;

	cout << "**************************" << endl;

	cout << m_name <<  " 向服务员 " 
			<< w.getName() << " 点了 "  
			<< iCount << " 份 "
			<< szFood << endl;

	// 服务员上菜
	w.serve(iCount,szFood);
	return ;
}
// 2.付款
void Guest::pay(Waiter &w)
{
	cout << "*********付款过程*********" << endl;
	double money = 0;
	cout << "请输入付款金额:";
	cin >>money;
	cout << "**************************" << endl;

	cout << m_name <<  " 吃完中饭,向服务员 " 
			<< w.getName() << " 支付了 "  
			<< money << " 元餐费,离开了老盛兴。 "
			<< endl;
	return ;
}

int main(int argc,char **argv)
{
	Waiter w("小张");
	Guest g("小裴");

	g.order(w);
	g.pay(w);

	return 0;
}

买鞋例子

#include <iostream>
using namespace std;

class Seller
{
	string m_name;
	
public:
	string m_thing;
	Seller(string name):m_name(name){}
	~Seller(){}
	
	string getName(){return m_name;}
	
	//发货
	void send(string name,int iCount)	//b未声明
	{
		cout << m_name << "给" 
			<< name << "发了"
			<< iCount << "双" << m_thing << endl;
	}

};

class Buyer
{

	string m_name;
	bool m_good;

public:
	Buyer(string name,bool good = true):m_name(name){}
	
	~Buyer(){}
	
	string getName(){return m_name;}
	
	void order(Seller &s)	//
	{
		cout << "*********订购过程*********" << endl;
		int iCount = 0;		// 物品的份数

		cout << "请输入物品名:";
		cin >>s.m_thing;

		cout << "请输入物品的份数:";
		cin >>iCount;

		cout << "**************************" << endl;

		cout << m_name <<  "在" 
			<< s.getName() << " 订购了 "  
			<< iCount << " 双 "
			<< s.m_thing << endl;

		// 卖家发货
		s.send(m_name,iCount);
		
		cout << "请输入你是否满意?";
		cin >> m_good;
	}
	
	//付款
	void pay(Seller &s)
	{
		cout << m_name << "对" << s.m_thing << (m_good?"很满意":"不满意")
			<< "于是" << (m_good?"支付了贷款":"就退货了")
			<< endl;
	}


};

int main(int argc,char **argv)
{
	Seller s("京东商城");
	Buyer b("艾米");
	
	b.order(s);
	b.pay(s);
	
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值