#include
using namespace std ;
typedef struct Student
{
char strname[50]; //姓名
int math; //数学分数
int chinese; //语文
int total; //总分
}STUDENT;
void InitData(STUDENT* some)
{
//////////////////////////////////////
//初始化数据
some->strname[0] = '\0';
some->math = 0;
some->chinese = 0;
some->total = 0;
}
void InputData(STUDENT* some)
{
///////////////////////////////////////
//获取输入
cout<<"enter name"<>some->strname;
cout<<"enter math"<>some->math;
cout<<"enter chinese"<>some->chinese;
//////////////////////////////////////
//计算总分
some->total = some->math + some->chinese;
}
void PrintData(STUDENT some)
{
cout<<some.strname<<"'s total mark is:"<<some.total<<endl;
}
//上面的部分可以单独放在一个头和CPP中
main()
{
STUDENT someone;
InitData(&someone);
InputData(&someone);
PrintData(someone);
}
到目前为止,程序的划分变得相对简单了,团队的开发才成为可能。在面向对象中,所存在的Wirth定律与上面的结构非常类似:
对象 = (算法 + 数据结构)
程序 = 对象 + 对象
表面上似乎二者之间并没有太大的差别,但就是这个差别为我们带来了巨大的变革。
有这样一句话:“编程是在计算机中反映世界”,我觉得再贴切不过,面向对象(Object-Oriented)对这种说法的体现也是最优秀的,比如在前面的例子中,我们设计的数据结构是一个学生成绩的表现,而对数据结构的操作(函数)是分离的,虽然这些操作是针对这种数据结构而产生的。为了管理大量的数据,我们不得不小心翼翼地使用它们。
面向对象中一个重要的概念就是类(class)C++中是它。类和struct数据结构最大的不同就是提供了限制级别(可见性)的保护——我们先抛开复杂的继承与多态不谈。正是通过这种方式,我们可以对数据成员提供非常有效的保护,同时使数据结构更符合现实行为。
在面向对象的概念中,前面的数据结构表示如下:
#include using namespace std; class Student { private: //属性 char strname[50]; //姓名 int math; //数学分数 int chinese; //语文 int total; //总分 public: //方法 char* getname(){ return strname; }; int getmath(){ return math; }; int getchinese(){ return chinese; }; int gettotal(){ return total; }; Student(); void InputData(); void PrintData(); }; Student::Student() { ////////////////////////////////////// //初始化数据 strname[0] = '\0'; math = 0; chinese = 0; total = 0; } void Student::InputData() { /////////////////////////////////////// //获取输入 cout<<"enter name"<>strname; cout<<"enter math"<>math; cout<<"enter chinese"<>chinese; ////////////////////////////////////// //计算总分 total = math + chinese; } void Student::PrintData() { cout<<strname<<"'s total mark is:"<<total<<endl; } int main() { Student someone; someone.InputData(); someone.PrintData(); } 我们先不去关心类的实现细节,现在对比一下main函数中的调用过程,每种方法和相应的数据结构联系在了一起,对外部的调用来说,我们不需要去关心数据结构和相应算法的关系,因为他们已经关联在了一起。也许这个例子不够说明问题,也许我的说明含糊不清,但是你想象一下:如果我们对一个物体,比如狗来建模,我们需要确定其属性(颜色、大小)和行为(跑、叫),我们肯定希望这些都与狗这个模型关联在一起:
Class dog
(属性)
Color
Size
(行为)
Run
yelp
如果是结构话的:
Struct dog
Color
Size
(依赖关系)
Run(dog somedog) yelp(dog somedog)
显然后面的结构比较复杂,更不要说缺乏有效的成员属性保护。另外一个面向对象的强大就是继承与多态,下一篇我们再来讨论。
我希望我前面的表达足够的清楚,面向对象不是这样一篇文章可以描述的清楚的,我这里只是描述了一个发展过程的片面。我希望它能成为一个引子,能够为初学者提供一些帮助。
本文地址:http://com.8s8s.com/it/it29798.htm