目录
面向对象程序设计
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;
}