文章目录
概要
面向对象(Object Oriented)是一种编程范式,是一种对现实世界理解和抽象的方法。这种理解性很强的知识需要漫长的时间去理解和掌握。需要掌握的原则之一就是:谁的事情谁负责。
例子
编程序,实现学生日常选课、给学生登记平时分数和最终考试成绩的过程。具体要求如下:
(1)定义课程类 :Course,属性包括:课程名,平时分(假设共5次平时分),平时分的平均分,期末成绩,综合成绩;函数包括:设置课程名、登记某次平时分、计算平均分、设置课程的期末成绩、求综合成绩(按平时分的平均分占30%,期末成绩占70%计算);
(2)定义学生类:Student,属性包括:学号,姓名,所选课程(假设只有一门);函数包括:设置学号和姓名、选课。
(3)主函数:
创建至少1个学生对象,为其设置学号和姓名;选课;登记5次平时分;设置该课程的期末成绩;求综合成绩;输出学号、姓名、课程名、5次平时分、期末成绩、综合成绩。
答案之一
#include <iostream>
#include <string>
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
class Course
{public:
void set_class();//设置课程名
int set_score();// 上平时分
int calculate_p();//计算平均分并求综合成绩
int set_final();//登期末成绩
void show_course();
private:
string subject;
int score[5];
int p_score;
int finl;
int integrated;
};
class Student
{private:
int number;
string name;
public:
void set_student();
void show_student();
};
int main(int argc, char** argv) {
Course c1;
Student s1;
s1.set_student();
c1.set_class();
c1.set_score();
c1.set_final();
c1.calculate_p();
s1.show_student();
c1.show_course();
return 0;
}
看似用了面向对象,实际上类之间并无本质的交互。
答案之二
#include<iostream>
#include<string>
using namespace std;
class Course
{
private:
string coursename;
double timegrade[5];
double aver;
double finalgrade;
double compregrade;
public:
void setCourse();
//其他函数
};
class Student
{
private:
string num;
string name;
public:
Course course1;
void set_value();
//其他函数
};
int main()
{
Student student;
student.set_value();
student.course1.setCourse();
//...
return 0;
}
对象之间有交互,但存在的问题:
- 可重用性差。从main函数看,没有创建课程对象,似乎“课程”类是专属“学生”类的,不能干别的用。
- 丧失封装性。不要直接用对象加点访问属性,尽管教材是那么讲的也不行。
- 写成这样更怀疑类的设计有错误:student.course1.setCourse()。
答案之三
- 谁的事情谁负责。学生类只负责学生属性的维护,课程类只负责课程属性的维护。可重用性好。
- 涉及到交互时,把事情交给对方做,手伸的别太长。main()中,学生对象需要访问课程对象的属性时,调用Student::CalAveUScore(); 实际上是把事情交给了课程对象,即cr.CalAveUScore(),原因是学生对象自己没有课程对象的属性,不是自己的属性自己不“亲自做”,谁能做最终交给谁来做。就是这个思想。